Merge branch 'next' of git://github.com/TheSerapher/php-mpos into next
Conflicts: POOLS.md
This commit is contained in:
commit
612aee56c8
18
POOLS.md
18
POOLS.md
@ -95,7 +95,6 @@ Small Time Miners are running various stratum only pools for different coins.
|
|||||||
|
|
||||||
### nutnut
|
### nutnut
|
||||||
|
|
||||||
|
|
||||||
| Pool URL | Coin | Avg. Hashrate | Avg. Active Workers | Notes |
|
| Pool URL | Coin | Avg. Hashrate | Avg. Active Workers | Notes |
|
||||||
| -------- | ---- | ------------: | ------------------: | ----- |
|
| -------- | ---- | ------------: | ------------------: | ----- |
|
||||||
| http://ftc.nut2pools.com | Feathercoin | 45-50Mhs | 25 workers | New style, PPLNS |
|
| http://ftc.nut2pools.com | Feathercoin | 45-50Mhs | 25 workers | New style, PPLNS |
|
||||||
@ -104,7 +103,6 @@ Small Time Miners are running various stratum only pools for different coins.
|
|||||||
|
|
||||||
### ahmedbodi
|
### ahmedbodi
|
||||||
|
|
||||||
|
|
||||||
| Pool URL | Coin | Avg. Hashrate | Avg. Active Workers | Notes |
|
| Pool URL | Coin | Avg. Hashrate | Avg. Active Workers | Notes |
|
||||||
| -------- | ---- | ------------: | ------------------: | ----- |
|
| -------- | ---- | ------------: | ------------------: | ----- |
|
||||||
| http://gme.crypto-expert.com | Gamecoin | 1.5Mhs | 3 workers | Custom Template, Prop |
|
| http://gme.crypto-expert.com | Gamecoin | 1.5Mhs | 3 workers | Custom Template, Prop |
|
||||||
@ -116,14 +114,12 @@ Small Time Miners are running various stratum only pools for different coins.
|
|||||||
|
|
||||||
### Neozonz
|
### Neozonz
|
||||||
|
|
||||||
|
|
||||||
| Pool URL | Coin | Avg. Hashrate | Avg. Active Workers | Notes |
|
| Pool URL | Coin | Avg. Hashrate | Avg. Active Workers | Notes |
|
||||||
| -------- | ---- | ------------: | ------------------: | ----- |
|
| -------- | ---- | ------------: | ------------------: | ----- |
|
||||||
| https://www.mine-litecoin.com | Litecoin | 10Mhs | 75 workers | Custom Template, Prop |
|
| https://www.mine-litecoin.com | Litecoin | 10Mhs | 75 workers | Custom Template, Prop |
|
||||||
|
|
||||||
### CaptainAK
|
### CaptainAK
|
||||||
|
|
||||||
|
|
||||||
| Pool URL | Coin | Avg. Hashrate | Avg. Active Workers | Notes |
|
| Pool URL | Coin | Avg. Hashrate | Avg. Active Workers | Notes |
|
||||||
| ----------------------- | ---- | ------------: | ------------------: | ----- |
|
| ----------------------- | ---- | ------------: | ------------------: | ----- |
|
||||||
| http://btb.pnwminer.com | Bitbar | 5-10 Mhs | 5 workers | PPLNS |
|
| http://btb.pnwminer.com | Bitbar | 5-10 Mhs | 5 workers | PPLNS |
|
||||||
@ -158,9 +154,19 @@ Small Time Miners are running various stratum only pools for different coins.
|
|||||||
| -------------------------------- | ----- | ------------: | ------------------: | ----- |
|
| -------------------------------- | ----- | ------------: | ------------------: | ----- |
|
||||||
| http://spotspool.chriskoeber.com | Spots | 37 Mhs | 55 workers | Prop |
|
| http://spotspool.chriskoeber.com | Spots | 37 Mhs | 55 workers | Prop |
|
||||||
|
|
||||||
### Coinium
|
|
||||||
|
### [Poolerino.com](http://poolerino.com/ "Poolerino.com") ([@Fredyy90](https://github.com/Fredyy90/ "Fredyy90 on GitHub"))
|
||||||
|
|
||||||
|
[Poolerino.com](http://poolerino.com/ "Poolerino.com") is going to build up a network of first-class, high performance pools on highend enterprise server hardware
|
||||||
|
|
||||||
|
| Pool URL | Coin | Avg. Hashrate | Avg. Active Workers | Notes |
|
||||||
|
| -------- | ---- | ------------: | ------------------: | ----- |
|
||||||
|
| http://doge.poolerino.com | Doge | 300 MH/s | 600 | PROP + VARDIFF + 0% Fee |
|
||||||
|
|
||||||
|
### Coinium (http://www.coinium.org/ "Coinium.org") ([@raistlinthewiz](https://github.com/raistlinthewþz/ "raistlinthewiz on GitHub"))
|
||||||
|
|
||||||
| Pool URL | Coin | Avg. Hashrate | Avg. Active Workers | Notes |
|
| Pool URL | Coin | Avg. Hashrate | Avg. Active Workers | Notes |
|
||||||
| -------------------------------- | ----- | ------------: | ------------------: | ----- |
|
| -------------------------------- | ----- | ------------: | ------------------: | ----- |
|
||||||
| http://doge.coinium.org | DOGE | 30 Mhs | 60 workers | PPLNS |
|
| http://doge.coinium.org | DOGE | 30 Mhs | 60 workers | PPLNS |
|
||||||
| http://emd.coinium.org | EMD | 1 Mhs | 3 workers | PPLNS |
|
| http://emd.coinium.org | EMD | 10 Mhs | 10 workers | PPLNS |
|
||||||
|
| http://earth.coinium.org | EAC | 10 Mhs | 30 workers |
|
||||||
|
|||||||
32
README.md
32
README.md
@ -70,13 +70,12 @@ Features
|
|||||||
The following feature have been implemented so far:
|
The following feature have been implemented so far:
|
||||||
|
|
||||||
* Fully re-written GUI with [Smarty][2] templates
|
* Fully re-written GUI with [Smarty][2] templates
|
||||||
|
* Full file based template support
|
||||||
|
* **NEW** SQL based templates
|
||||||
* Mobile WebUI
|
* Mobile WebUI
|
||||||
* Scrypt, **NEW** SHA256, VARDIFF Support
|
* Scrypt, SHA256, VARDIFF Support
|
||||||
* Reward Systems
|
* Reward Systems
|
||||||
* Propotional
|
* Propotional, PPS and PPLNS
|
||||||
* PPS
|
|
||||||
* PPLNS
|
|
||||||
* Statistics are cached in Memcache by Cronjob for quick data access
|
|
||||||
* New Theme
|
* New Theme
|
||||||
* Live Dashboard
|
* Live Dashboard
|
||||||
* AJAX Support
|
* AJAX Support
|
||||||
@ -87,12 +86,9 @@ The following feature have been implemented so far:
|
|||||||
* Worker activity
|
* Worker activity
|
||||||
* Worker hashrates
|
* Worker hashrates
|
||||||
* Pool statistics
|
* Pool statistics
|
||||||
* Minimal Block statistics
|
* Block statistics
|
||||||
* Pool donations
|
* Pool donations, fees and block bonuses
|
||||||
* Pool fees
|
* Manual and auto payout
|
||||||
* Block Bonus Payouts
|
|
||||||
* Manual payout
|
|
||||||
* Auto payout
|
|
||||||
* Transaction list
|
* Transaction list
|
||||||
* Admin Panel
|
* Admin Panel
|
||||||
* Cron Monitoring Overview
|
* Cron Monitoring Overview
|
||||||
@ -101,22 +97,24 @@ The following feature have been implemented so far:
|
|||||||
* User Transactions
|
* User Transactions
|
||||||
* News Posts
|
* News Posts
|
||||||
* Pool Settings
|
* Pool Settings
|
||||||
|
* Templates
|
||||||
|
* Pool Workers
|
||||||
|
* User Reports
|
||||||
|
* Template Overwrite
|
||||||
* Notification system
|
* Notification system
|
||||||
* IDLE Workers
|
* IDLE Workers
|
||||||
* New blocks found in pool
|
* New blocks found in pool
|
||||||
* Auto Payout
|
* Auto Payout
|
||||||
* Manual Payout
|
* Manual Payout
|
||||||
* User-to-user Invitation System
|
* User-to-user Invitation System
|
||||||
* Support for various Scrypt based coins via config
|
* Support for various coins via config
|
||||||
* MNC
|
* All scrypt coins
|
||||||
* LTC
|
* All sha256d coins
|
||||||
* ...
|
|
||||||
|
|
||||||
Installation
|
Installation
|
||||||
============
|
============
|
||||||
|
|
||||||
Please take a look at the [Quick Start Guide](https://github.com/TheSerapher/php-mpos/wiki/Quick-Start-Guide). This will give you
|
Please take a look at the [Quick Start Guide](https://github.com/TheSerapher/php-mpos/wiki/Quick-Start-Guide). This will give you an idea how to setup `MPOS`.
|
||||||
an idea how to setup `MPOS`.
|
|
||||||
|
|
||||||
Customization
|
Customization
|
||||||
=============
|
=============
|
||||||
|
|||||||
@ -26,9 +26,12 @@ chdir(dirname(__FILE__));
|
|||||||
require_once('shared.inc.php');
|
require_once('shared.inc.php');
|
||||||
|
|
||||||
// If we don't keep archives, delete some now to release disk space
|
// If we don't keep archives, delete some now to release disk space
|
||||||
if (!$share->purgeArchive()) {
|
$affected_rows = $share->purgeArchive();
|
||||||
|
if ($affected_rows === false) {
|
||||||
$log->logError("Failed to delete archived shares, not critical but should be checked: " . $share->getCronError());
|
$log->logError("Failed to delete archived shares, not critical but should be checked: " . $share->getCronError());
|
||||||
$monitoring->endCronjob($cron_name, 'E0008', 1, true);
|
$monitoring->endCronjob($cron_name, 'E0008', 1, true);
|
||||||
|
} else {
|
||||||
|
$log->logDebug("Deleted $affected_rows archived shares this run");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Cron cleanup and monitoring
|
// Cron cleanup and monitoring
|
||||||
|
|||||||
@ -155,7 +155,7 @@ class Notification extends Mail {
|
|||||||
if ($stmt->close() && $this->sendMail('notifications/' . $strType, $aMailData) && $this->addNotification($account_id, $strType, $aMailData)) {
|
if ($stmt->close() && $this->sendMail('notifications/' . $strType, $aMailData) && $this->addNotification($account_id, $strType, $aMailData)) {
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
$this->setErrorMessage('SendMail call failed: ' . $this->mail->getError());
|
$this->setErrorMessage('SendMail call failed: ' . $this->getError());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@ -172,50 +172,31 @@ class Share Extends Base {
|
|||||||
**/
|
**/
|
||||||
public function purgeArchive() {
|
public function purgeArchive() {
|
||||||
// Fallbacks if unset
|
// Fallbacks if unset
|
||||||
if (!isset($this->config['purge']['shares'])) $this->config['purge']['shares'] = 25000;
|
if (!isset($this->config['archive']['purge'])) $this->config['archive']['purge'] = 5;
|
||||||
if (!isset($this->config['purge']['sleep'])) $this->config['purge']['sleep'] = 1;
|
|
||||||
|
|
||||||
// TODO: This could need some cleanup work somtime but works
|
$stmt = $this->mysqli->prepare("SELECT CEIL(COUNT(id) / 100 * ?) AS count FROM $this->tableArchive");
|
||||||
if ($this->config['payout_system'] == 'pplns') {
|
if ($this->checkStmt($stmt) && $stmt->bind_param('i', $this->config['archive']['purge']) && $stmt->execute() && $result = $stmt->get_result()) {
|
||||||
// Fetch our last block so we can go back configured rounds
|
$limit = $result->fetch_object()->count;
|
||||||
$aLastBlock = $this->block->getLast();
|
|
||||||
// Fetch the block we need to find the share_id
|
|
||||||
$aBlock = $this->block->getBlock($aLastBlock['height'] - $this->config['archive']['maxrounds']);
|
|
||||||
|
|
||||||
// We need to find a hard limit id so we don't run into an infinite loop, skip process if we can't find a limit
|
|
||||||
$stmt = $this->mysqli->prepare("SELECT MAX(id) AS id FROM $this->tableArchive WHERE block_id < ? AND time < DATE_SUB(now(), INTERVAL ? MINUTE)");
|
|
||||||
if ($this->checkStmt($stmt) && $stmt->bind_param('ii', $aBlock['id'], $this->config['archive']['maxage']) && $stmt->execute() && $result = $stmt->get_result())
|
|
||||||
if ( ! $max_id = $result->fetch_object()->id ) return true;
|
|
||||||
// Now that we know our block, remove those shares
|
|
||||||
$affected = 1;
|
|
||||||
while ($affected > 0) {
|
|
||||||
// Sleep first to allow any IO to cleanup
|
|
||||||
sleep($this->config['purge']['sleep']);
|
|
||||||
$stmt = $this->mysqli->prepare("DELETE FROM $this->tableArchive WHERE block_id < ? AND time < DATE_SUB(now(), INTERVAL ? MINUTE) AND id <= ? LIMIT " . $this->config['purge']['shares']);
|
|
||||||
if ($this->checkStmt($stmt) && $stmt->bind_param('iii', $aBlock['id'], $this->config['archive']['maxage'], $max_id) && $stmt->execute()) {
|
|
||||||
$affected = $stmt->affected_rows;
|
|
||||||
} else {
|
|
||||||
return $this->sqlError();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
// We need to find a hard limit id so we don't run into an infinite loop, skip process if we can't find a limit
|
return $this->sqlError();
|
||||||
$stmt = $this->mysqli->prepare("SELECT MAX(id) AS id FROM $this->tableArchive WHERE time < DATE_SUB(now(), INTERVAL ? MINUTE)");
|
|
||||||
if ($this->checkStmt($stmt) && $stmt->bind_param('i', $this->config['archive']['maxage']) && $stmt->execute() && $result = $stmt->get_result())
|
|
||||||
if ( ! $max_id = $result->fetch_object()->id ) return true;
|
|
||||||
$affected = 1;
|
|
||||||
while ($affected > 0) {
|
|
||||||
// Sleep first to allow any IO to cleanup
|
|
||||||
sleep($this->config['purge']['sleep']);
|
|
||||||
$stmt = $this->mysqli->prepare("DELETE FROM $this->tableArchive WHERE time < DATE_SUB(now(), INTERVAL ? MINUTE) AND id <= ? LIMIT " . $this->config['purge']['shares']);
|
|
||||||
if ($this->checkStmt($stmt) && $stmt->bind_param('ii', $this->config['archive']['maxage'], $max_id) && $stmt->execute()) {
|
|
||||||
$affected = $stmt->affected_rows;
|
|
||||||
} else {
|
|
||||||
return $this->sqlError();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return true;
|
$stmt->close();
|
||||||
|
$stmt = $this->mysqli->prepare("
|
||||||
|
DELETE FROM $this->tableArchive WHERE time < (
|
||||||
|
SELECT MIN(time) FROM (
|
||||||
|
SELECT MIN(time) AS time
|
||||||
|
FROM $this->tableArchive
|
||||||
|
WHERE block_id = (
|
||||||
|
SELECT MIN(id) AS minid FROM (
|
||||||
|
SELECT id FROM " . $this->block->getTableName() . " ORDER BY height DESC LIMIT ?
|
||||||
|
) AS minheight
|
||||||
|
) UNION SELECT DATE_SUB(now(), INTERVAL ? MINUTE) AS time
|
||||||
|
) AS mintime
|
||||||
|
) LIMIT $limit
|
||||||
|
");
|
||||||
|
if ($this->checkStmt($stmt) && $stmt->bind_param('ii', $this->config['archive']['maxrounds'], $this->config['archive']['maxage']) && $stmt->execute())
|
||||||
|
return $stmt->affected_rows;
|
||||||
|
return $this->sqlError();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -812,11 +812,11 @@ class Statistics extends Base {
|
|||||||
$dNetworkHashrate = $this->bitcoin->getnetworkhashps();
|
$dNetworkHashrate = $this->bitcoin->getnetworkhashps();
|
||||||
$dDifficulty = $this->bitcoin->getdifficulty();
|
$dDifficulty = $this->bitcoin->getdifficulty();
|
||||||
} else {
|
} else {
|
||||||
$dNetworkHashrate = 0;
|
$dNetworkHashrate = 1;
|
||||||
$dDifficulty = 1;
|
$dDifficulty = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return pow(2, 32) * $dDifficulty / $dNetworkHashrate;
|
return $this->memcache->setCache(__FUNCTION__, pow(2, 32) * $dDifficulty / $dNetworkHashrate);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -832,7 +832,23 @@ class Statistics extends Base {
|
|||||||
$dDifficulty = 1;
|
$dDifficulty = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return round($dDifficulty * $this->config['cointarget'] / $this->getNetworkExpectedTimePerBlock(), 8);
|
return $this->memcache->setCache(__FUNCTION__, round($dDifficulty * $this->config['cointarget'] / $this->getNetworkExpectedTimePerBlock(), 8));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Number of blocks until next difficulty change
|
||||||
|
* @return blocks int blocks until difficulty change
|
||||||
|
**/
|
||||||
|
public function getBlocksUntilDiffChange(){
|
||||||
|
if ($data = $this->memcache->get(__FUNCTION__)) return $data;
|
||||||
|
|
||||||
|
if ($this->bitcoin->can_connect() === true) {
|
||||||
|
$iBlockcount = $this->bitcoin->getblockcount();
|
||||||
|
} else {
|
||||||
|
$iBlockcount = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->memcache->setCache(__FUNCTION__, $this->config['coindiffchangetarget'] - ($iBlockcount % $this->config['coindiffchangetarget']));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -106,7 +106,7 @@ $aSettings['statistics'][] = array(
|
|||||||
);
|
);
|
||||||
$aSettings['statistics'][] = array(
|
$aSettings['statistics'][] = array(
|
||||||
'display' => 'Ajax Data Interval', 'type' => 'select',
|
'display' => 'Ajax Data Interval', 'type' => 'select',
|
||||||
'options' => array('60' => '1', '300' => '5', '600' => '10'),
|
'options' => array('60' => '1', '180' => '3', '300' => '5', '600' => '10'),
|
||||||
'default' => 300,
|
'default' => 300,
|
||||||
'name' => 'statistics_ajax_data_interval', 'value' => $setting->getValue('statistics_ajax_data_interval'),
|
'name' => 'statistics_ajax_data_interval', 'value' => $setting->getValue('statistics_ajax_data_interval'),
|
||||||
'tooltip' => 'Time in minutes, interval for hashrate and sharerate calculations. Higher intervals allow for better accuracy at a higer server load.'
|
'tooltip' => 'Time in minutes, interval for hashrate and sharerate calculations. Higher intervals allow for better accuracy at a higer server load.'
|
||||||
|
|||||||
@ -178,6 +178,19 @@ $config['currency'] = 'LTC';
|
|||||||
**/
|
**/
|
||||||
$config['cointarget'] = '150';
|
$config['cointarget'] = '150';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Diff change every X Blocks
|
||||||
|
*
|
||||||
|
* Explanation
|
||||||
|
* Amount of Blocks until Difficulty change
|
||||||
|
*
|
||||||
|
* Fastcoin: 300 Blocks
|
||||||
|
* Litecoin: 2016 Blocks
|
||||||
|
* Bitcoin: 2016 Blocks
|
||||||
|
*
|
||||||
|
**/
|
||||||
|
$config['coindiffchangetarget'] = 2016;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Default transaction fee to apply to user transactions
|
* Default transaction fee to apply to user transactions
|
||||||
*
|
*
|
||||||
|
|||||||
@ -5,7 +5,7 @@ if (!defined('SECURITY'))
|
|||||||
die('Hacking attempt');
|
die('Hacking attempt');
|
||||||
|
|
||||||
// Instantiate class, we are using mysqlng
|
// Instantiate class, we are using mysqlng
|
||||||
$mysqli = new mysqli($config['db']['host'], $config['db']['user'], $config['db']['pass'], $config['db']['name']);
|
$mysqli = new mysqli($config['db']['host'], $config['db']['user'], $config['db']['pass'], $config['db']['name'], $config['db']['port']);
|
||||||
|
|
||||||
/* check connection */
|
/* check connection */
|
||||||
if (mysqli_connect_errno()) {
|
if (mysqli_connect_errno()) {
|
||||||
|
|||||||
@ -91,10 +91,11 @@ if ($iEstShares > 0 && $aRoundShares['valid'] > 0) {
|
|||||||
|
|
||||||
$dExpectedTimePerBlock = $statistics->getNetworkExpectedTimePerBlock();
|
$dExpectedTimePerBlock = $statistics->getNetworkExpectedTimePerBlock();
|
||||||
$dEstNextDifficulty = $statistics->getExpectedNextDifficulty();
|
$dEstNextDifficulty = $statistics->getExpectedNextDifficulty();
|
||||||
|
$iBlocksUntilDiffChange = $statistics->getBlocksUntilDiffChange();
|
||||||
|
|
||||||
// Output JSON format
|
// Output JSON format
|
||||||
$data = array(
|
$data = array(
|
||||||
'raw' => array( 'personal' => array( 'hashrate' => $dPersonalHashrate ), 'pool' => array( 'hashrate' => $dPoolHashrate ), 'network' => array( 'hashrate' => $dNetworkHashrate / 1000, 'esttimeperblock' => $dExpectedTimePerBlock, 'nextdifficulty' => $dEstNextDifficulty ) ),
|
'raw' => array( 'personal' => array( 'hashrate' => $dPersonalHashrate ), 'pool' => array( 'hashrate' => $dPoolHashrate ), 'network' => array( 'hashrate' => $dNetworkHashrate / 1000, 'esttimeperblock' => $dExpectedTimePerBlock, 'nextdifficulty' => $dEstNextDifficulty, 'blocksuntildiffchange' => $iBlocksUntilDiffChange ) ),
|
||||||
'personal' => array (
|
'personal' => array (
|
||||||
'hashrate' => $dPersonalHashrateAdjusted, 'sharerate' => $dPersonalSharerate, 'sharedifficulty' => $dPersonalShareDifficulty,
|
'hashrate' => $dPersonalHashrateAdjusted, 'sharerate' => $dPersonalSharerate, 'sharedifficulty' => $dPersonalShareDifficulty,
|
||||||
'shares' => array('valid' => $aUserRoundShares['valid'], 'invalid' => $aUserRoundShares['invalid'], 'invalid_percent' => $dUserInvalidPercent, 'unpaid' => $dUnpaidShares ),
|
'shares' => array('valid' => $aUserRoundShares['valid'], 'invalid' => $aUserRoundShares['invalid'], 'invalid_percent' => $dUserInvalidPercent, 'unpaid' => $dUnpaidShares ),
|
||||||
@ -111,7 +112,7 @@ $data = array(
|
|||||||
'target_bits' => $config['difficulty']
|
'target_bits' => $config['difficulty']
|
||||||
),
|
),
|
||||||
'system' => array( 'load' => sys_getloadavg() ),
|
'system' => array( 'load' => sys_getloadavg() ),
|
||||||
'network' => array( 'hashrate' => $dNetworkHashrateAdjusted, 'difficulty' => $dDifficulty, 'block' => $iBlock, 'esttimeperblock' => round($dExpectedTimePerBlock ,2), 'nextdifficulty' => $dEstNextDifficulty ),
|
'network' => array( 'hashrate' => $dNetworkHashrateAdjusted, 'difficulty' => $dDifficulty, 'block' => $iBlock, 'esttimeperblock' => round($dExpectedTimePerBlock ,2), 'nextdifficulty' => $dEstNextDifficulty, 'blocksuntildiffchange' => $iBlocksUntilDiffChange ),
|
||||||
);
|
);
|
||||||
|
|
||||||
echo $api->get_json($data);
|
echo $api->get_json($data);
|
||||||
|
|||||||
@ -37,12 +37,13 @@ if ($user->isAuthenticated()) {
|
|||||||
|
|
||||||
$dExpectedTimePerBlock = $statistics->getNetworkExpectedTimePerBlock();
|
$dExpectedTimePerBlock = $statistics->getNetworkExpectedTimePerBlock();
|
||||||
$dEstNextDifficulty = $statistics->getExpectedNextDifficulty();
|
$dEstNextDifficulty = $statistics->getExpectedNextDifficulty();
|
||||||
|
$iBlocksUntilDiffChange = $statistics->getBlocksUntilDiffChange();
|
||||||
|
|
||||||
// Make it available in Smarty
|
// Make it available in Smarty
|
||||||
$smarty->assign('DISABLED_DASHBOARD', $setting->getValue('disable_dashboard'));
|
$smarty->assign('DISABLED_DASHBOARD', $setting->getValue('disable_dashboard'));
|
||||||
$smarty->assign('DISABLED_DASHBOARD_API', $setting->getValue('disable_dashboard_api'));
|
$smarty->assign('DISABLED_DASHBOARD_API', $setting->getValue('disable_dashboard_api'));
|
||||||
$smarty->assign('ESTIMATES', array('shares' => $iEstShares, 'percent' => $dEstPercent));
|
$smarty->assign('ESTIMATES', array('shares' => $iEstShares, 'percent' => $dEstPercent));
|
||||||
$smarty->assign('NETWORK', array('difficulty' => $dDifficulty, 'block' => $iBlock, 'EstNextDifficulty' => $dEstNextDifficulty, 'EstTimePerBlock' => $dExpectedTimePerBlock));
|
$smarty->assign('NETWORK', array('difficulty' => $dDifficulty, 'block' => $iBlock, 'EstNextDifficulty' => $dEstNextDifficulty, 'EstTimePerBlock' => $dExpectedTimePerBlock, 'BlocksUntilDiffChange' => $iBlocksUntilDiffChange));
|
||||||
$smarty->assign('INTERVAL', $interval / 60);
|
$smarty->assign('INTERVAL', $interval / 60);
|
||||||
$smarty->assign('CONTENT', 'default.tpl');
|
$smarty->assign('CONTENT', 'default.tpl');
|
||||||
}
|
}
|
||||||
|
|||||||
@ -8,8 +8,8 @@ if ($setting->getValue('recaptcha_enabled')) {
|
|||||||
$rsp = recaptcha_check_answer (
|
$rsp = recaptcha_check_answer (
|
||||||
$setting->getValue('recaptcha_private_key'),
|
$setting->getValue('recaptcha_private_key'),
|
||||||
$_SERVER["REMOTE_ADDR"],
|
$_SERVER["REMOTE_ADDR"],
|
||||||
$_POST["recaptcha_challenge_field"],
|
( (isset($_POST["recaptcha_challenge_field"])) ? $_POST["recaptcha_challenge_field"] : null ),
|
||||||
$_POST["recaptcha_response_field"]
|
( (isset($_POST["recaptcha_response_field"])) ? $_POST["recaptcha_response_field"] : null )
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -19,7 +19,7 @@ if ($setting->getValue('disable_invitations') && $setting->getValue('lock_regist
|
|||||||
$_SESSION['POPUP'][] = array('CONTENT' => 'Only invited users are allowed to register.', 'TYPE' => 'errormsg');
|
$_SESSION['POPUP'][] = array('CONTENT' => 'Only invited users are allowed to register.', 'TYPE' => 'errormsg');
|
||||||
} else {
|
} else {
|
||||||
// Check if recaptcha is enabled, process form data if valid
|
// Check if recaptcha is enabled, process form data if valid
|
||||||
if($setting->getValue('recaptcha_enabled') && $_POST["recaptcha_response_field"] && $_POST["recaptcha_response_field"]!=''){
|
if($setting->getValue('recaptcha_enabled') && isset($_POST["recaptcha_response_field"]) && $_POST["recaptcha_response_field"]!=''){
|
||||||
if ($rsp->is_valid) {
|
if ($rsp->is_valid) {
|
||||||
$smarty->assign("RECAPTCHA", recaptcha_get_html($setting->getValue('recaptcha_public_key')));
|
$smarty->assign("RECAPTCHA", recaptcha_get_html($setting->getValue('recaptcha_public_key')));
|
||||||
isset($_POST['token']) ? $token = $_POST['token'] : $token = '';
|
isset($_POST['token']) ? $token = $_POST['token'] : $token = '';
|
||||||
|
|||||||
@ -54,6 +54,7 @@ if (!$smarty->isCached('master.tpl', $smarty_cache_key)) {
|
|||||||
|
|
||||||
$dExpectedTimePerBlock = $statistics->getNetworkExpectedTimePerBlock();
|
$dExpectedTimePerBlock = $statistics->getNetworkExpectedTimePerBlock();
|
||||||
$dEstNextDifficulty = $statistics->getExpectedNextDifficulty();
|
$dEstNextDifficulty = $statistics->getExpectedNextDifficulty();
|
||||||
|
$iBlocksUntilDiffChange = $statistics->getBlocksUntilDiffChange();
|
||||||
|
|
||||||
// Propagate content our template
|
// Propagate content our template
|
||||||
$smarty->assign("ESTTIME", $iEstTime);
|
$smarty->assign("ESTTIME", $iEstTime);
|
||||||
@ -64,7 +65,7 @@ if (!$smarty->isCached('master.tpl', $smarty_cache_key)) {
|
|||||||
$smarty->assign("CONTRIBHASHES", $aContributorsHashes);
|
$smarty->assign("CONTRIBHASHES", $aContributorsHashes);
|
||||||
$smarty->assign("CURRENTBLOCK", $iBlock);
|
$smarty->assign("CURRENTBLOCK", $iBlock);
|
||||||
$smarty->assign("CURRENTBLOCKHASH", @$sBlockHash);
|
$smarty->assign("CURRENTBLOCKHASH", @$sBlockHash);
|
||||||
$smarty->assign('NETWORK', array('difficulty' => $dDifficulty, 'block' => $iBlock, 'EstNextDifficulty' => $dEstNextDifficulty, 'EstTimePerBlock' => $dExpectedTimePerBlock));
|
$smarty->assign('NETWORK', array('difficulty' => $dDifficulty, 'block' => $iBlock, 'EstNextDifficulty' => $dEstNextDifficulty, 'EstTimePerBlock' => $dExpectedTimePerBlock, 'BlocksUntilDiffChange' => $iBlocksUntilDiffChange));
|
||||||
$smarty->assign('ESTIMATES', array('shares' => $iEstShares, 'percent' => $dEstPercent));
|
$smarty->assign('ESTIMATES', array('shares' => $iEstShares, 'percent' => $dEstPercent));
|
||||||
if (count($aBlockData) > 0) {
|
if (count($aBlockData) > 0) {
|
||||||
$smarty->assign("LASTBLOCK", $aBlockData['height']);
|
$smarty->assign("LASTBLOCK", $aBlockData['height']);
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
<article class="module width_full">
|
<article class="module width_full">
|
||||||
<header><h3>News Posts</h3></header>
|
<header><h3>News Posts</h3></header>
|
||||||
|
<ul><li>News posts support the Markdown syntax</li></ul>
|
||||||
<form method="POST" action="{$smarty.server.PHP_SELF}">
|
<form method="POST" action="{$smarty.server.PHP_SELF}">
|
||||||
<input type="hidden" name="page" value="{$smarty.request.page|escape}">
|
<input type="hidden" name="page" value="{$smarty.request.page|escape}">
|
||||||
<input type="hidden" name="action" value="{$smarty.request.action|escape}">
|
<input type="hidden" name="action" value="{$smarty.request.action|escape}">
|
||||||
|
|||||||
@ -140,7 +140,7 @@ $(document).ready(function(){
|
|||||||
$('#b-pvalid').html(data.getdashboarddata.data.pool.shares.valid);
|
$('#b-pvalid').html(data.getdashboarddata.data.pool.shares.valid);
|
||||||
$('#b-pivalid').html(data.getdashboarddata.data.pool.shares.invalid + " (" + data.getdashboarddata.data.pool.shares.invalid_percent + "%)" );
|
$('#b-pivalid').html(data.getdashboarddata.data.pool.shares.invalid + " (" + data.getdashboarddata.data.pool.shares.invalid_percent + "%)" );
|
||||||
$('#b-diff').html(data.getdashboarddata.data.network.difficulty);
|
$('#b-diff').html(data.getdashboarddata.data.network.difficulty);
|
||||||
$('#b-nextdiff').html(data.getdashboarddata.data.network.nextdifficulty);
|
$('#b-nextdiff').html(data.getdashboarddata.data.network.nextdifficulty + " (Change in " + data.getdashboarddata.data.network.blocksuntildiffchange + " Blocks)");
|
||||||
$('#b-esttimeperblock').html(data.getdashboarddata.data.network.esttimeperblock + " seconds"); // <- this needs some nicer format
|
$('#b-esttimeperblock').html(data.getdashboarddata.data.network.esttimeperblock + " seconds"); // <- this needs some nicer format
|
||||||
$('#b-nblock').html(data.getdashboarddata.data.network.block);
|
$('#b-nblock').html(data.getdashboarddata.data.network.block);
|
||||||
$('#b-target').html(data.getdashboarddata.data.pool.shares.estimated + " (done: " + data.getdashboarddata.data.pool.shares.progress + "%)" );
|
$('#b-target').html(data.getdashboarddata.data.pool.shares.estimated + " (done: " + data.getdashboarddata.data.pool.shares.progress + "%)" );
|
||||||
|
|||||||
@ -7,7 +7,7 @@
|
|||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td><b>Est Next Difficulty</b></td>
|
<td><b>Est Next Difficulty</b></td>
|
||||||
<td id="b-nextdiff" class="right">{$NETWORK.EstNextDifficulty}</td>
|
<td id="b-nextdiff" class="right">{$NETWORK.EstNextDifficulty} (Change in {$NETWORK.BlocksUntilDiffChange} Blocks)</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td><b>Est. Avg. Time per Block</b></td>
|
<td><b>Est. Avg. Time per Block</b></td>
|
||||||
|
|||||||
@ -26,14 +26,14 @@
|
|||||||
<tr>
|
<tr>
|
||||||
<th align="left">Est. Next Difficulty</td>
|
<th align="left">Est. Next Difficulty</td>
|
||||||
{if ! $GLOBAL.website.chaininfo.disabled}
|
{if ! $GLOBAL.website.chaininfo.disabled}
|
||||||
<td><a href="{$GLOBAL.website.chaininfo.url}" target="_new"><font size="2"><span id="b-diff">{$NETWORK.EstNextDifficulty}</span></font></a></td>
|
<td><a href="{$GLOBAL.website.chaininfo.url}" target="_new"><font size="2">{$NETWORK.EstNextDifficulty} (Change in {$NETWORK.BlocksUntilDiffChange} Blocks)</font></a></td>
|
||||||
{else}
|
{else}
|
||||||
<td><font size="2"><span id="b-diff">{$NETWORK.EstNextDifficulty}</span></font></td>
|
<td><font size="2">{$NETWORK.EstNextDifficulty} (Change in {$NETWORK.EstNextDifficulty} Blocks)</font></td>
|
||||||
{/if}
|
{/if}
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<th align="left">Est. Avg. Time per Round (Network)</td>
|
<th align="left">Est. Avg. Time per Round (Network)</td>
|
||||||
<td><font size="2"><span id="b-diff">{$NETWORK.EstTimePerBlock|seconds_to_words}</span></font></td>
|
<td><font size="2">{$NETWORK.EstTimePerBlock|seconds_to_words}</font></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<th align="left">Est. Avg. Time per Round (Pool)</td>
|
<th align="left">Est. Avg. Time per Round (Pool)</td>
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user