diff --git a/.gitignore b/.gitignore index 788a1bd7..67b09557 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,6 @@ /cronjobs/logs/*.txt /cronjobs/logs/*.txt.*.gz /public/templates/cache/*.php +# Test configs +public/include/config/global.inc.scrypt.php +public/include/config/global.inc.sha.php diff --git a/cronjobs/findblock.php b/cronjobs/findblock.php old mode 100755 new mode 100644 index 2709b562..2ce27efd --- a/cronjobs/findblock.php +++ b/cronjobs/findblock.php @@ -75,17 +75,21 @@ if (empty($aAllBlocks)) { $log->logDebug('No new blocks without share_id found in database'); } else { // Loop through our unaccounted blocks - $log->logInfo("Block ID\tHeight\t\tAmount\tShare ID\tShares\tFinder\t\tType"); + $log->logInfo("Block ID\tHeight\t\tAmount\tShare ID\tShares\tFinder\tWorker\t\tType"); foreach ($aAllBlocks as $iIndex => $aBlock) { if (empty($aBlock['share_id'])) { // Fetch share information if ( !$iPreviousShareId = $block->getLastShareId()) $iPreviousShareId = 0; - // Fetch this blocks upstream ID $aBlockRPCInfo = $bitcoin->query('getblock', $aBlock['blockhash']); if ($share->findUpstreamShare($aBlockRPCInfo, $iPreviousShareId)) { $iCurrentUpstreamId = $share->getUpstreamShareId(); + // Rarely happens, but did happen once to me + if ($iCurrentUpstreamId == $iPreviousShareId) { + $log->logFatal($share->getErrorMsg('E0063')); + $monitoring->endCronjob($cron_name, 'E0063', 1, true); + } // Out of order share detection if ($iCurrentUpstreamId < $iPreviousShareId) { // Fetch our offending block @@ -99,7 +103,7 @@ if (empty($aAllBlocks)) { // Shares seem to be out of order, so lets change them if ( !$share->updateShareById($iCurrentUpstreamId, $aShareError) || !$share->updateShareById($iPreviousShareId, $aShareCurrent)) { // We couldn't update one of the shares! That might mean they have been deleted already - $log->logFatal('E0003: Failed to change shares order!'); + $log->logFatal('E0003: Failed to change shares order: ' . $share->getCronError()); $monitoring->endCronjob($cron_name, 'E0003', 1, true); } // Reset our offending block so the next run re-checks the shares @@ -112,6 +116,7 @@ if (empty($aAllBlocks)) { } else { $iRoundShares = $share->getRoundShares($iPreviousShareId, $iCurrentUpstreamId); $iAccountId = $user->getUserId($share->getUpstreamFinder()); + $iWorker = $share->getUpstreamWorker(); } } else { $log->logFatal('E0005: Unable to fetch blocks upstream share, aborted:' . $share->getCronError()); @@ -125,6 +130,7 @@ if (empty($aAllBlocks)) { . $iCurrentUpstreamId . "\t\t" . $iRoundShares . "\t" . "[$iAccountId] " . $user->getUserName($iAccountId) . "\t" + . $iWorker . "\t" . $share->share_type ); @@ -133,6 +139,8 @@ if (empty($aAllBlocks)) { $log->logError('Failed to update share ID in database for block ' . $aBlock['height'] . ': ' . $block->getCronError()); if (!$block->setFinder($aBlock['id'], $iAccountId)) $log->logError('Failed to update finder account ID in database for block ' . $aBlock['height'] . ': ' . $block->getCronError()); + if (!$block->setFindingWorker($aBlock['id'], $iWorker)) + $log->logError('Failed to update worker ID in database for block ' . $aBlock['height'] . ': ' . $block->getCronError()); if (!$block->setShares($aBlock['id'], $iRoundShares)) $log->logError('Failed to update share count in database for block ' . $aBlock['height'] . ': ' . $block->getCronError()); if ($config['block_bonus'] > 0 && !$transaction->addTransaction($iAccountId, $config['block_bonus'], 'Bonus', $aBlock['id'])) { diff --git a/cronjobs/notifications.php b/cronjobs/notifications.php index 9c9d6896..4bb80a80 100755 --- a/cronjobs/notifications.php +++ b/cronjobs/notifications.php @@ -44,7 +44,7 @@ if (empty($aWorkers)) { $aData['email'] = $user->getUserEmail($aData['username']); $log->logDebug(" " . $aWorker['username'] . "..."); if (!$notification->sendNotification($aWorker['account_id'], 'idle_worker', $aData)) - $log->logError(" Failed sending notifications: " . $notification->getCronError() . "\n"); + $log->logDebug(" Failed sending notifications: " . $notification->getCronError() . "\n"); } } @@ -62,7 +62,7 @@ if (!empty($aNotifications)) { if ($notification->setInactive($aNotification['id'])) { $log->logDebug(" updated #" . $aNotification['id'] . " for " . $aWorker['username'] . " as inactive\n"); } else { - $log->logInfo(" failed to update #" . $aNotification['id'] . " for " . $aWorker['username'] . "\n"); + $log->logError(" failed to update #" . $aNotification['id'] . " for " . $aWorker['username'] . "\n"); } } else { $log->logDebug(" still inactive\n"); diff --git a/cronjobs/tickerupdate.php b/cronjobs/tickerupdate.php index 5c6d4638..45908b4d 100755 --- a/cronjobs/tickerupdate.php +++ b/cronjobs/tickerupdate.php @@ -38,11 +38,13 @@ if ($price = $tools->getPrice()) { } // Update Uptime Robot status in Settings table via API call -if ($api_keys = $setting->getValue('monitoring_uptimerobot_api_keys') && strstr($api_keys, '|')) { - $monitoring->setTools($tools); - if (!$monitoring->storeUptimeRobotStatus()) { - $log->logError($monitoring->getCronError()); - $monitoring->endCronjob($cron_name, 'E0017', 1, false); +if ($api_keys = $setting->getValue('monitoring_uptimerobot_api_keys')) { + if (!strstr($api_keys, '|')) { + $monitoring->setTools($tools); + if (!$monitoring->storeUptimeRobotStatus()) { + $log->logError($monitoring->getCronError()); + $monitoring->endCronjob($cron_name, 'E0017', 1, false); + } } } else { $log->logDebug('Skipped Uptime Robot API update, missing api keys'); diff --git a/public/include/classes/bitcoinwrapper.class.php b/public/include/classes/bitcoinwrapper.class.php index 6881babc..2ce5056b 100644 --- a/public/include/classes/bitcoinwrapper.class.php +++ b/public/include/classes/bitcoinwrapper.class.php @@ -48,15 +48,21 @@ class BitcoinWrapper extends BitcoinClient { if ($data = $this->memcache->get(__FUNCTION__)) return $data; try { $dNetworkHashrate = $this->query('getmininginfo'); - if (is_array($dNetworkHashrate) && array_key_exists('networkhashps', $dNetworkHashrate)) { - $dNetworkHashrate = $dNetworkHashrate['networkhashps']; - } else if (is_array($dNetworkHashrate) && array_key_exists('hashespersec', $dNetworkHashrate)) { - $dNetworkHashrate = $dNetworkHashrate['hashespersec']; - } else if (is_array($dNetworkHashrate) && array_key_exists('netmhashps', $dNetworkHashrate)) { - $dNetworkHashrate = $dNetworkHashrate['netmhashps'] * 1000 * 1000; + if (is_array($dNetworkHashrate)) { + if (array_key_exists('networkhashps', $dNetworkHashrate)) { + $dNetworkHashrate = $dNetworkHashrate['networkhashps']; + } else if (array_key_exists('hashespersec', $dNetworkHashrate)) { + $dNetworkHashrate = $dNetworkHashrate['hashespersec']; + } else if (array_key_exists('netmhashps', $dNetworkHashrate)) { + $dNetworkHashrate = $dNetworkHashrate['netmhashps'] * 1000 * 1000; + } else { + // Unsupported implementation + $dNetworkHashrate = 0; + } } } catch (Exception $e) { - return false; + // getmininginfo does not exist, cache for an hour + return $this->memcache->setCache(__FUNCTION__, 0, 3600); } return $this->memcache->setCache(__FUNCTION__, $dNetworkHashrate, 30); } diff --git a/public/include/classes/block.class.php b/public/include/classes/block.class.php index 1edfb3b4..3ed11d1f 100644 --- a/public/include/classes/block.class.php +++ b/public/include/classes/block.class.php @@ -197,6 +197,17 @@ class Block extends Base { $field = array( 'name' => 'account_id', 'value' => $account_id, 'type' => 'i' ); return $this->updateSingle($block_id, $field); } + + /** + * Set finding worker of a block + * @param block_id int Block ID + * @param worker_id int Worker ID of finder + * @return bool + **/ + public function setFindingWorker($block_id, $worker=NULL) { + $field = array( 'name' => 'worker_name', 'value' => $worker, 'type' => 's' ); + return $this->updateSingle($block_id, $field); + } /** * Set finding share for a block diff --git a/public/include/classes/share.class.php b/public/include/classes/share.class.php index cc634269..30ab344c 100644 --- a/public/include/classes/share.class.php +++ b/public/include/classes/share.class.php @@ -231,6 +231,9 @@ class Share Extends Base { public function getUpstreamFinder() { return @$this->oUpstream->account; } + public function getUpstreamWorker() { + return @$this->oUpstream->worker; + } public function getUpstreamShareId() { return @$this->oUpstream->id; } @@ -254,39 +257,39 @@ class Share Extends Base { $header_hex = implode(unpack("H*", $header_bin)); // Stratum supported blockhash solution entry - $stmt = $this->mysqli->prepare("SELECT SUBSTRING_INDEX( `username` , '.', 1 ) AS account, id FROM $this->table WHERE solution = ? LIMIT 1"); + $stmt = $this->mysqli->prepare("SELECT SUBSTRING_INDEX( `username` , '.', 1 ) AS account, username as worker, id FROM $this->table WHERE solution = ? LIMIT 1"); if ($this->checkStmt($stmt) && $stmt->bind_param('s', $aBlock['hash']) && $stmt->execute() && $result = $stmt->get_result()) { $this->oUpstream = $result->fetch_object(); $this->share_type = 'stratum_blockhash'; - if (!empty($this->oUpstream->account) && is_int($this->oUpstream->id)) + if (!empty($this->oUpstream->account) && !empty($this->oUpstream->worker) && is_int($this->oUpstream->id)) return true; } // Stratum scrypt hash check $scrypt_hash = swapEndian(bin2hex(Scrypt::calc($header_bin, $header_bin, 1024, 1, 1, 32))); - $stmt = $this->mysqli->prepare("SELECT SUBSTRING_INDEX( `username` , '.', 1 ) AS account, id FROM $this->table WHERE solution = ? LIMIT 1"); + $stmt = $this->mysqli->prepare("SELECT SUBSTRING_INDEX( `username` , '.', 1 ) AS account, username as worker, id FROM $this->table WHERE solution = ? LIMIT 1"); if ($this->checkStmt($stmt) && $stmt->bind_param('s', $scrypt_hash) && $stmt->execute() && $result = $stmt->get_result()) { $this->oUpstream = $result->fetch_object(); $this->share_type = 'stratum_solution'; - if (!empty($this->oUpstream->account) && is_int($this->oUpstream->id)) + if (!empty($this->oUpstream->account) && !empty($this->oUpstream->worker) && is_int($this->oUpstream->id)) return true; } // Failed to fetch via startum solution, try pushpoold // Fallback to pushpoold solution type $ppheader = sprintf('%08d', $aBlock['version']) . word_reverse($aBlock['previousblockhash']) . word_reverse($aBlock['merkleroot']) . dechex($aBlock['time']) . $aBlock['bits'] . dechex($aBlock['nonce']); - $stmt = $this->mysqli->prepare("SELECT SUBSTRING_INDEX( `username` , '.', 1 ) AS account, id FROM $this->table WHERE solution LIKE CONCAT(?, '%') LIMIT 1"); + $stmt = $this->mysqli->prepare("SELECT SUBSTRING_INDEX( `username` , '.', 1 ) AS account, username as worker, id FROM $this->table WHERE solution LIKE CONCAT(?, '%') LIMIT 1"); if ($this->checkStmt($stmt) && $stmt->bind_param('s', $ppheader) && $stmt->execute() && $result = $stmt->get_result()) { $this->oUpstream = $result->fetch_object(); $this->share_type = 'pp_solution'; - if (!empty($this->oUpstream->account) && is_int($this->oUpstream->id)) + if (!empty($this->oUpstream->account) && !empty($this->oUpstream->worker) && is_int($this->oUpstream->id)) return true; } // Still no match, try upstream result with timerange $stmt = $this->mysqli->prepare(" SELECT - SUBSTRING_INDEX( `username` , '.', 1 ) AS account, id + SUBSTRING_INDEX( `username` , '.', 1 ) AS account, username as worker, id FROM $this->table WHERE upstream_result = 'Y' AND id > ? @@ -296,14 +299,14 @@ class Share Extends Base { if ($this->checkStmt($stmt) && $stmt->bind_param('iii', $last, $aBlock['time'], $aBlock['time']) && $stmt->execute() && $result = $stmt->get_result()) { $this->oUpstream = $result->fetch_object(); $this->share_type = 'upstream_share'; - if (!empty($this->oUpstream->account) && is_int($this->oUpstream->id)) + if (!empty($this->oUpstream->account) && !empty($this->oUpstream->worker) && is_int($this->oUpstream->id)) return true; } // We failed again, now we take ANY result matching the timestamp $stmt = $this->mysqli->prepare(" SELECT - SUBSTRING_INDEX( `username` , '.', 1 ) AS account, id + SUBSTRING_INDEX( `username` , '.', 1 ) AS account, username as worker, id FROM $this->table WHERE our_result = 'Y' AND id > ? @@ -312,10 +315,11 @@ class Share Extends Base { if ($this->checkStmt($stmt) && $stmt->bind_param('ii', $last, $aBlock['time']) && $stmt->execute() && $result = $stmt->get_result()) { $this->oUpstream = $result->fetch_object(); $this->share_type = 'any_share'; - if (!empty($this->oUpstream->account) && is_int($this->oUpstream->id)) + if (!empty($this->oUpstream->account) && !empty($this->oUpstream->worker) && is_int($this->oUpstream->id)) return true; } - return $this->getErrorMsg('E0052', $aBlock['height']); + $this->setErrorMessage($this->getErrorMsg('E0052', $aBlock['height'])); + return false; } /** diff --git a/public/include/classes/statistics.class.php b/public/include/classes/statistics.class.php index bae7ed81..8d4803eb 100644 --- a/public/include/classes/statistics.class.php +++ b/public/include/classes/statistics.class.php @@ -122,7 +122,7 @@ class Statistics extends Base { **/ public function getBlocksFoundHeight($iHeight=0, $limit=10) { $this->debug->append("STA " . __METHOD__, 4); - if ($data = $this->memcache->get(__FUNCTION__ . $iHeight . $limit)) return $data; + if ($data = $this->memcache->get(__FUNCTION__ . $iHeight . $limit)) return $data; $stmt = $this->mysqli->prepare(" SELECT b.*, @@ -139,6 +139,54 @@ class Statistics extends Base { return $this->sqlError(); } + /** + * Get SUM of blocks found and generated Coins for each Account + * @param limit int Last limit blocks + * @return array + **/ + public function getBlocksSolvedbyAccount($limit=25) { + $this->debug->append("STA " . __METHOD__, 4); + if ($data = $this->memcache->get(__FUNCTION__ . $limit)) return $data; + $stmt = $this->mysqli->prepare(" + SELECT + b.*, + a.username AS finder, + a.is_anonymous AS is_anonymous, + COUNT(b.id) AS solvedblocks, + SUM(b.amount) AS generatedcoins + FROM " . $this->block->getTableName() . " AS b + LEFT JOIN " . $this->user->getTableName() . " AS a + ON b.account_id = a.id + WHERE confirmations > 0 + GROUP BY finder + ORDER BY solvedblocks DESC LIMIT ?"); + if ($this->checkStmt($stmt) && $stmt->bind_param("i", $limit) && $stmt->execute() && $result = $stmt->get_result()) + return $this->memcache->setCache(__FUNCTION__ . $limit, $result->fetch_all(MYSQLI_ASSOC), 5); + return $this->sqlError(); + } + + /** + * Get SUM of blocks found and generated Coins for each worker + * @param limit int Last limit blocks + * @return array + **/ + public function getBlocksSolvedbyWorker($account_id, $limit=25) { + $this->debug->append("STA " . __METHOD__, 4); + if ($data = $this->memcache->get(__FUNCTION__ . $account_id . $limit)) return $data; + $stmt = $this->mysqli->prepare(" + SELECT + worker_name AS finder, + COUNT(id) AS solvedblocks, + SUM(amount) AS generatedcoins + FROM " . $this->block->getTableName() . " + WHERE account_id = ? AND worker_name != 'unknown' + GROUP BY finder + ORDER BY solvedblocks DESC LIMIT ?"); + if ($this->checkStmt($stmt) && $stmt->bind_param("ii", $account_id, $limit) && $stmt->execute() && $result = $stmt->get_result()) + return $this->memcache->setCache(__FUNCTION__ . $account_id . $limit, $result->fetch_all(MYSQLI_ASSOC), 5); + return $this->sqlError(); + } + /** * Currently the only function writing to the database * Stored per block user statistics of valid and invalid shares @@ -356,11 +404,10 @@ class Statistics extends Base { /** * Admin panel specific query - * @return data array invlid and valid shares for all accounts + * @return data array User settings and shares **/ public function getAllUserStats($filter='%') { $this->debug->append("STA " . __METHOD__, 4); - if ($this->getGetCache() && $data = $this->memcache->get(__FUNCTION__ . $filter)) return $data; $stmt = $this->mysqli->prepare(" SELECT a.id AS id, @@ -369,17 +416,20 @@ class Statistics extends Base { a.no_fees as no_fees, a.username AS username, a.donate_percent AS donate_percent, - a.email AS email, - ROUND(IFNULL(SUM(IF(s.difficulty=0, POW(2, (" . $this->config['difficulty'] . " - 16)), s.difficulty)), 0) / POW(2, (" . $this->config['difficulty'] . " - 16)), 0) AS shares + a.email AS email FROM " . $this->user->getTableName() . " AS a - LEFT JOIN " . $this->share->getTableName() . " AS s - ON a.username = SUBSTRING_INDEX( s.username, '.', 1 ) WHERE a.username LIKE ? GROUP BY username ORDER BY username"); - if ($this->checkStmt($stmt) && $stmt->bind_param('s', $filter) && $stmt->execute() && $result = $stmt->get_result()) - return $this->memcache->setCache(__FUNCTION__ . $filter, $result->fetch_all(MYSQLI_ASSOC)); + if ($this->checkStmt($stmt) && $stmt->bind_param('s', $filter) && $stmt->execute() && $result = $stmt->get_result()) { + // Add our cached shares to the users + while ($row = $result->fetch_assoc()) { + $row['shares'] = $this->getUserShares($row['id']); + $aUsers[] = $row; + } + return $aUsers; + } return $this->sqlError(); } diff --git a/public/include/config/admin_settings.inc.php b/public/include/config/admin_settings.inc.php index a345cb31..37769bd5 100644 --- a/public/include/config/admin_settings.inc.php +++ b/public/include/config/admin_settings.inc.php @@ -187,6 +187,13 @@ $aSettings['acl'][] = array( 'name' => 'acl_round_statistics', 'value' => $setting->getValue('acl_round_statistics'), 'tooltip' => 'Make the round statistics page private (users only) or public.' ); +$aSettings['acl'][] = array( + 'display' => 'Block Finder Statistics', 'type' => 'select', + 'options' => array( 0 => 'Private', 1 => 'Public'), + 'default' => 1, + 'name' => 'acl_blockfinder_statistics', 'value' => $setting->getValue('acl_blockfinder_statistics'), + 'tooltip' => 'Make the Block Finder Statistics page private (users only) or public.' +); $aSettings['acl'][] = array( 'display' => 'Uptime Statistics', 'type' => 'select', 'options' => array( 0 => 'Private', 1 => 'Public'), @@ -257,6 +264,20 @@ $aSettings['system'][] = array( 'name' => 'disable_contactform', 'value' => $setting->getValue('disable_contactform'), 'tooltip' => 'Enable or Disable Contactform. Users will not be able to use the contact form.' ); +$aSettings['system'][] = array( + 'display' => 'Disable Donors Page', 'type' => 'select', + 'options' => array( 0 => 'No', 1 => 'Yes'), + 'default' => 1, + 'name' => 'disable_donors', 'value' => $setting->getValue('disable_donors'), + 'tooltip' => 'Showing Donors page in Navigation.' +); +$aSettings['system'][] = array( + 'display' => 'Disable About Page', 'type' => 'select', + 'options' => array( 0 => 'No', 1 => 'Yes'), + 'default' => 1, + 'name' => 'disable_about', 'value' => $setting->getValue('disable_about'), + 'tooltip' => 'Showing About page in Navigation.' +); $aSettings['recaptcha'][] = array( 'display' => 'Enable re-Captcha', 'type' => 'select', 'options' => array( 0 => 'No', 1 => 'Yes' ), diff --git a/public/include/config/error_codes.inc.php b/public/include/config/error_codes.inc.php index 5eda21da..518bed00 100644 --- a/public/include/config/error_codes.inc.php +++ b/public/include/config/error_codes.inc.php @@ -66,4 +66,5 @@ $aErrorCodes['E0059'] = 'Worker already exists'; $aErrorCodes['E0060'] = 'Failed to add new worker'; $aErrorCodes['E0061'] = 'Failed to delete worker'; $aErrorCodes['E0062'] = 'Block has no share_id, not running payouts'; +$aErrorCodes['E0063'] = 'Upstream share already assigned to previous block'; ?> diff --git a/public/include/config/global.inc.dist.php b/public/include/config/global.inc.dist.php index b6814772..bf0961bc 100644 --- a/public/include/config/global.inc.dist.php +++ b/public/include/config/global.inc.dist.php @@ -69,9 +69,6 @@ $config['wallet']['host'] = 'localhost:19334'; $config['wallet']['username'] = 'testnet'; $config['wallet']['password'] = 'testnet'; - - - /** * Getting Started Config * @@ -83,9 +80,6 @@ $config['wallet']['password'] = 'testnet'; $config['gettingstarted']['coinname'] = 'Litecoin'; $config['gettingstarted']['coinurl'] = 'http://www.litecoin.org'; $config['gettingstarted']['stratumport'] = '3333'; - - - /** * API configuration to fetch prices for set currency @@ -115,7 +109,6 @@ $config['price']['url'] = 'https://btc-e.com'; $config['price']['target'] = '/api/2/ltc_usd/ticker'; $config['price']['currency'] = 'USD'; - /** * Automatic payout thresholds * diff --git a/public/include/pages/about/donors.inc.php b/public/include/pages/about/donors.inc.php index e4ff8753..0d4213f7 100644 --- a/public/include/pages/about/donors.inc.php +++ b/public/include/pages/about/donors.inc.php @@ -3,9 +3,15 @@ // Make sure we are called from index.php if (!defined('SECURITY')) die('Hacking attempt'); -$aDonors = $transaction->getDonations(); +if ($setting->getValue('disable_donors')) { + $_SESSION['POPUP'][] = array('CONTENT' => 'Donors are currently disabled. Please try again later.', 'TYPE' => 'errormsg'); + $smarty->assign("CONTENT", "disabled.tpl"); +} else { + $aDonors = $transaction->getDonations(); + + // Tempalte specifics + $smarty->assign("DONORS", $aDonors); + $smarty->assign("CONTENT", "default.tpl"); +} -// Tempalte specifics -$smarty->assign("DONORS", $aDonors); -$smarty->assign("CONTENT", "default.tpl"); ?> diff --git a/public/include/pages/about/pool.inc.php b/public/include/pages/about/pool.inc.php index aecab054..20c860f0 100644 --- a/public/include/pages/about/pool.inc.php +++ b/public/include/pages/about/pool.inc.php @@ -4,6 +4,12 @@ if (!defined('SECURITY')) die('Hacking attempt'); -// Tempalte specifics -$smarty->assign("CONTENT", "default.tpl"); +if ($setting->getValue('disable_about')) { + $_SESSION['POPUP'][] = array('CONTENT' => 'Donors are currently disabled. Please try again later.', 'TYPE' => 'errormsg'); + $smarty->assign("CONTENT", "disabled.tpl"); +} else { + // Tempalte specifics + $smarty->assign("CONTENT", "default.tpl"); +} + ?> diff --git a/public/include/pages/admin/user.inc.php b/public/include/pages/admin/user.inc.php index bc562bbf..5ad323d5 100644 --- a/public/include/pages/admin/user.inc.php +++ b/public/include/pages/admin/user.inc.php @@ -31,23 +31,11 @@ if (@$_POST['query']) { $aUsers = $statistics->getAllUserStats($_POST['query']); // Add additional stats to each user - // This is not optimized yet, best is a proper SQL - // Query against the stats table? Currently cached though. foreach ($aUsers as $iKey => $aUser) { $aBalance = $transaction->getBalance($aUser['id']); $aUser['balance'] = $aBalance['confirmed']; $aUser['hashrate'] = $statistics->getUserHashrate($aUser['id']); - if ($aUser['shares'] > 0) { - $aUser['payout']['est_block'] = round(( (int)$aUser['shares'] / (int)$aRoundShares['valid'] ) * (int)$config['reward'], 3); - $aUser['payout']['est_fee'] = round(($config['fees'] / 100) * $aUser['payout']['est_block'], 3); - $aUser['payout']['est_donation'] = round((( $aUser['donate_percent'] / 100) * ($aUser['payout']['est_block'] - $aUser['payout']['est_fee'])), 3); - $aUser['payout']['est_payout'] = round($aUser['payout']['est_block'] - $aUser['payout']['est_donation'] - $aUser['payout']['est_fee'], 3); - } else { - $aUser['payout']['est_block'] = 0; - $aUser['payout']['est_fee'] = 0; - $aUser['payout']['est_donation'] = 0; - $aUser['payout']['est_payout'] = 0; - } + $aUser['estimates'] = $statistics->getUserEstimates($aRoundShares, $aUser['shares'], $aUser['donate_percent'], $aUser['no_fees']); $aUsers[$iKey] = $aUser; } // Assign our variables diff --git a/public/include/pages/api/getdashboarddata.inc.php b/public/include/pages/api/getdashboarddata.inc.php index 7cce9b6c..c3877e75 100644 --- a/public/include/pages/api/getdashboarddata.inc.php +++ b/public/include/pages/api/getdashboarddata.inc.php @@ -91,7 +91,10 @@ $data = array( 'shares' => array('valid' => $aUserRoundShares['valid'], 'invalid' => $aUserRoundShares['invalid'], 'invalid_percent' => $dUserInvalidPercent, 'unpaid' => $dUnpaidShares ), 'balance' => $transaction->getBalance($user_id), 'estimates' => $aEstimates, 'workers' => $aWorkers ), 'pool' => array( - 'name' => $setting->getValue('website_name'), + 'info' => array( + 'name' => $setting->getValue('website_name'), + 'currency' => $config['currency'] + ), 'workers' => $worker->getCountAllActiveWorkers(), 'hashrate' => $dPoolHashrateAdjusted, 'shares' => array( 'valid' => $aRoundShares['valid'], 'invalid' => $aRoundShares['invalid'], 'invalid_percent' => $dPoolInvalidPercent, 'estimated' => $iEstShares, 'progress' => $dEstPercent ), 'price' => $aPrice, diff --git a/public/include/pages/statistics/blockfinder.inc.php b/public/include/pages/statistics/blockfinder.inc.php new file mode 100644 index 00000000..dcf75226 --- /dev/null +++ b/public/include/pages/statistics/blockfinder.inc.php @@ -0,0 +1,26 @@ +isCached('master.tpl', $smarty_cache_key)) { + $debug->append('No cached version available, fetching from backend', 3); + + $getBlocksSolvedbyAccount = $statistics->getBlocksSolvedbyAccount(); + $smarty->assign("BLOCKSSOLVEDBYACCOUNT", $getBlocksSolvedbyAccount); +} else { + $debug->append('Using cached page', 3); +} + +if ($setting->getValue('acl_blockfinder_statistics')) { + $smarty->assign("CONTENT", "finder.tpl"); +} else if ($user->isAuthenticated()) { + $getBlocksSolvedbyWorker = $statistics->getBlocksSolvedbyWorker($_SESSION['USERDATA']['id']); + $smarty->assign("BLOCKSSOLVEDBYWORKER", $getBlocksSolvedbyWorker); + $smarty->assign("CONTENT", "finder.tpl"); +} else { + $_SESSION['POPUP'][] = array('CONTENT' => 'Block Finders are currently disabled. Please try again later.', 'TYPE' => 'errormsg'); + $smarty->assign("CONTENT", "default.tpl"); +} +?> diff --git a/public/include/pages/statistics/pool.inc.php b/public/include/pages/statistics/pool.inc.php index 0252f1fb..91dca946 100644 --- a/public/include/pages/statistics/pool.inc.php +++ b/public/include/pages/statistics/pool.inc.php @@ -22,7 +22,7 @@ if (!$smarty->isCached('master.tpl', $smarty_cache_key)) { // Top hash contributors $aContributorsHashes = $statistics->getTopContributors('hashes', 15); - // Grab the last 10 blocks found + // Grab the last 5 blocks found as a quick overview $iLimit = 5; $aBlocksFoundData = $statistics->getBlocksFound($iLimit); count($aBlocksFoundData) > 0 ? $aBlockData = $aBlocksFoundData[0] : $aBlockData = array(); @@ -34,22 +34,14 @@ if (!$smarty->isCached('master.tpl', $smarty_cache_key)) { $iCurrentPoolHashrate > 0 ? $iEstTime = $dDifficulty * pow(2,32) / ($iCurrentPoolHashrate * 1000) : $iEstTime = 0; // Time since last block - $now = new DateTime( "now" ); if (!empty($aBlockData)) { - $dTimeSinceLast = ($now->getTimestamp() - $aBlockData['time']); + $dTimeSinceLast = (time() - $aBlockData['time']); if ($dTimeSinceLast < 0) $dTimeSinceLast = 0; } else { $dTimeSinceLast = 0; } - // Past blocks found, max 4 weeks back - $iFoundBlocksByTime = $statistics->getLastBlocksbyTime(); - $iFirstBlockFound = $statistics->getFirstBlockFound(); - $iTimeSinceFirstBlockFound = ($now->getTimestamp() - $iFirstBlockFound); - // Propagate content our template - $smarty->assign("FIRSTBLOCKFOUND", $iTimeSinceFirstBlockFound); - $smarty->assign("LASTBLOCKSBYTIME", $iFoundBlocksByTime); $smarty->assign("ESTTIME", $iEstTime); $smarty->assign("TIMESINCELAST", $dTimeSinceLast); $smarty->assign("BLOCKSFOUND", $aBlocksFoundData); diff --git a/public/include/smarty_globals.inc.php b/public/include/smarty_globals.inc.php index a3dc2f0a..806349dd 100644 --- a/public/include/smarty_globals.inc.php +++ b/public/include/smarty_globals.inc.php @@ -91,6 +91,8 @@ $aGlobal['website']['email'] = $setting->getValue('website_email'); $aGlobal['website']['api']['disabled'] = $setting->getValue('disable_api'); $aGlobal['website']['blockexplorer']['disabled'] = $setting->getValue('website_blockexplorer_disabled'); $aGlobal['website']['chaininfo']['disabled'] = $setting->getValue('website_chaininfo_disabled'); +$aGlobal['website']['donors']['disabled'] = $setting->getValue('disable_donors'); +$aGlobal['website']['about']['disabled'] = $setting->getValue('disable_about'); $setting->getValue('website_blockexplorer_url') ? $aGlobal['website']['blockexplorer']['url'] = $setting->getValue('website_blockexplorer_url') : $aGlobal['website']['blockexplorer']['url'] = 'http://explorer.litecoin.net/block/'; $setting->getValue('website_chaininfo_url') ? $aGlobal['website']['chaininfo']['url'] = $setting->getValue('website_chaininfo_url') : $aGlobal['website']['chaininfo']['url'] = 'http://allchains.info'; @@ -102,6 +104,7 @@ $aGlobal['statistics']['analytics']['code'] = $setting->getValue('statistics_ana $aGlobal['acl']['pool']['statistics'] = $setting->getValue('acl_pool_statistics'); $aGlobal['acl']['block']['statistics'] = $setting->getValue('acl_block_statistics'); $aGlobal['acl']['round']['statistics'] = $setting->getValue('acl_round_statistics'); +$aGlobal['acl']['blockfinder']['statistics'] = $setting->getValue('acl_blockfinder_statistics'); $aGlobal['acl']['uptime']['statistics'] = $setting->getValue('acl_uptime_statistics'); // We don't want these session infos cached diff --git a/public/site_assets/mpos/css/fontello-codes.css b/public/site_assets/mpos/css/fontello-codes.css index 5e87a41e..a39c72df 100644 --- a/public/site_assets/mpos/css/fontello-codes.css +++ b/public/site_assets/mpos/css/fontello-codes.css @@ -1,6 +1,7 @@ .icon-dollar:before { content: '\e818'; } /* '' */ .icon-doc:before { content: '\e81b'; } /* '' */ +.icon-login:before { content: '\e81c'; } /* '' */ .icon-exchange:before { content: '\e81a'; } /* '' */ .icon-money:before { content: '\e819'; } /* '' */ .icon-mail:before { content: '\e814'; } /* '' */ @@ -18,7 +19,7 @@ .icon-bell:before { content: '\e817'; } /* '' */ .icon-trash:before { content: '\e812'; } /* '' */ .icon-cog:before { content: '\e810'; } /* '' */ -.icon-login:before { content: '\e81c'; } /* '' */ +.icon-search:before { content: '\e827'; } /* '' */ .icon-resize-full-alt:before { content: '\e824'; } /* '' */ .icon-down-open:before { content: '\e825'; } /* '' */ .icon-left-open:before { content: '\e801'; } /* '' */ diff --git a/public/site_assets/mpos/css/fontello-config.json b/public/site_assets/mpos/css/fontello-config.json index d0fdae41..b8fb0a0b 100644 --- a/public/site_assets/mpos/css/fontello-config.json +++ b/public/site_assets/mpos/css/fontello-config.json @@ -12,6 +12,12 @@ "code": 59416, "src": "fontawesome" }, + { + "uid": "7222571caa5c15f83dcfd447c58d68d9", + "css": "search", + "code": 59431, + "src": "entypo" + }, { "uid": "a204f0fa972408eaae5a363c444991b2", "css": "login", diff --git a/public/site_assets/mpos/css/fontello-embedded.css b/public/site_assets/mpos/css/fontello-embedded.css index 054bb98f..c3967c2f 100644 --- a/public/site_assets/mpos/css/fontello-embedded.css +++ b/public/site_assets/mpos/css/fontello-embedded.css @@ -1,15 +1,15 @@ @font-face { font-family: 'fontello'; - src: url('../font/fontello.eot?67777040'); - src: url('../font/fontello.eot?67777040#iefix') format('embedded-opentype'), - url('../font/fontello.svg?67777040#fontello') format('svg'); + src: url('../font/fontello.eot?18499504'); + src: url('../font/fontello.eot?18499504#iefix') format('embedded-opentype'), + url('../font/fontello.svg?18499504#fontello') format('svg'); font-weight: normal; font-style: normal; } @font-face { font-family: 'fontello'; - src: url('data:application/octet-stream;base64,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') format('woff'), - url('data:application/octet-stream;base64,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') format('truetype'); + src: url('data:application/octet-stream;base64,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') format('woff'), + url('data:application/octet-stream;base64,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sAIlRyNHI2EgsAUlsAQlRyNHI2GwBiWwBSVJsAIlYbABRWMjIFhiGyFZY7ABRWJgIy4jICA8ijgjIVktsDUssAAWILAIQyAuRyNHI2EgYLAgYGawgGIjICA8ijgtsDYsIyAuRrACJUZSWCA8WS6xJgEUKy2wNywjIC5GsAIlRlBYIDxZLrEmARQrLbA4LCMgLkawAiVGUlggPFkjIC5GsAIlRlBYIDxZLrEmARQrLbA5LLAwKyMgLkawAiVGUlggPFkusSYBFCstsDossDEriiAgPLAEI0KKOCMgLkawAiVGUlggPFkusSYBFCuwBEMusCYrLbA7LLAAFrAEJbAEJiAuRyNHI2GwBkUrIyA8IC4jOLEmARQrLbA8LLEIBCVCsAAWsAQlsAQlIC5HI0cjYSCwBCNCsAZFKyCwYFBYILBAUVizAiADIBuzAiYDGllCQiMgR7AEQ7CAYmAgsAArIIqKYSCwAkNgZCOwA0NhZFBYsAJDYRuwA0NgWbADJbCAYmGwAiVGYTgjIDwjOBshICBGI0ewACsjYTghWbEmARQrLbA9LLAwKy6xJgEUKy2wPiywMSshIyAgPLAEI0IjOLEmARQrsARDLrAmKy2wPyywABUgR7AAI0KyAAEBFRQTLrAsKi2wQCywABUgR7AAI0KyAAEBFRQTLrAsKi2wQSyxAAEUE7AtKi2wQiywLyotsEMssAAWRSMgLiBGiiNhOLEmARQrLbBELLAII0KwQystsEUssgAAPCstsEYssgABPCstsEcssgEAPCstsEgssgEBPCstsEkssgAAPSstsEossgABPSstsEsssgEAPSstsEwssgEBPSstsE0ssgAAOSstsE4ssgABOSstsE8ssgEAOSstsFAssgEBOSstsFEssgAAOystsFIssgABOystsFMssgEAOystsFQssgEBOystsFUssgAAPistsFYssgABPistsFcssgEAPistsFgssgEBPistsFkssgAAOistsFossgABOistsFsssgEAOistsFwssgEBOistsF0ssDIrLrEmARQrLbBeLLAyK7A2Ky2wXyywMiuwNystsGAssAAWsDIrsDgrLbBhLLAzKy6xJgEUKy2wYiywMyuwNistsGMssDMrsDcrLbBkLLAzK7A4Ky2wZSywNCsusSYBFCstsGYssDQrsDYrLbBnLLA0K7A3Ky2waCywNCuwOCstsGkssDUrLrEmARQrLbBqLLA1K7A2Ky2wayywNSuwNystsGwssDUrsDgrLbBtLCuwCGWwAyRQeLABFTAtAAAAS7gAyFJYsQEBjlm5CAAIAGMgsAEjRLADI3CyBCgJRVJEsgoCByqxBgFEsSQBiFFYsECIWLEGA0SxJgGIUVi4BACIWLEGAURZWVlZuAH/hbAEjbEFAEQAAA==') format('truetype'); } /* Chrome hack: SVG is rendered more smooth in Windozze. 100% magic, uncomment if you need it. */ /* Note, that will break hinting! In other OS-es font will be not as sharp as it could be */ @@ -17,7 +17,7 @@ @media screen and (-webkit-min-device-pixel-ratio:0) { @font-face { font-family: 'fontello'; - src: url('../font/fontello.svg?67777040#fontello') format('svg'); + src: url('../font/fontello.svg?18499504#fontello') format('svg'); } } */ @@ -54,6 +54,7 @@ } .icon-dollar:before { content: '\e818'; } /* '' */ .icon-doc:before { content: '\e81b'; } /* '' */ +.icon-login:before { content: '\e81c'; } /* '' */ .icon-exchange:before { content: '\e81a'; } /* '' */ .icon-money:before { content: '\e819'; } /* '' */ .icon-mail:before { content: '\e814'; } /* '' */ @@ -71,7 +72,7 @@ .icon-bell:before { content: '\e817'; } /* '' */ .icon-trash:before { content: '\e812'; } /* '' */ .icon-cog:before { content: '\e810'; } /* '' */ -.icon-login:before { content: '\e81c'; } /* '' */ +.icon-search:before { content: '\e827'; } /* '' */ .icon-resize-full-alt:before { content: '\e824'; } /* '' */ .icon-down-open:before { content: '\e825'; } /* '' */ .icon-left-open:before { content: '\e801'; } /* '' */ diff --git a/public/site_assets/mpos/css/fontello-ie7-codes.css b/public/site_assets/mpos/css/fontello-ie7-codes.css index 405779c6..d1bfdab6 100644 --- a/public/site_assets/mpos/css/fontello-ie7-codes.css +++ b/public/site_assets/mpos/css/fontello-ie7-codes.css @@ -1,6 +1,7 @@ .icon-dollar { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-doc { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-login { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-exchange { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-money { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-mail { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } @@ -18,7 +19,7 @@ .icon-bell { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-trash { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-cog { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-login { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-search { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-resize-full-alt { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-down-open { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-left-open { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } diff --git a/public/site_assets/mpos/css/fontello-ie7.css b/public/site_assets/mpos/css/fontello-ie7.css index ba85b7e6..a7ac0b2d 100644 --- a/public/site_assets/mpos/css/fontello-ie7.css +++ b/public/site_assets/mpos/css/fontello-ie7.css @@ -12,6 +12,7 @@ .icon-dollar { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-doc { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-login { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-exchange { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-money { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-mail { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } @@ -29,7 +30,7 @@ .icon-bell { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-trash { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-cog { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-login { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-search { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-resize-full-alt { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-down-open { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-left-open { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } diff --git a/public/site_assets/mpos/css/fontello.css b/public/site_assets/mpos/css/fontello.css index 39e90a43..13fb6ec4 100644 --- a/public/site_assets/mpos/css/fontello.css +++ b/public/site_assets/mpos/css/fontello.css @@ -1,10 +1,10 @@ @font-face { font-family: 'fontello'; - src: url('../font/fontello.eot?25380644'); - src: url('../font/fontello.eot?25380644#iefix') format('embedded-opentype'), - url('../font/fontello.woff?25380644') format('woff'), - url('../font/fontello.ttf?25380644') format('truetype'), - url('../font/fontello.svg?25380644#fontello') format('svg'); + src: url('../font/fontello.eot?43056661'); + src: url('../font/fontello.eot?43056661#iefix') format('embedded-opentype'), + url('../font/fontello.woff?43056661') format('woff'), + url('../font/fontello.ttf?43056661') format('truetype'), + url('../font/fontello.svg?43056661#fontello') format('svg'); font-weight: normal; font-style: normal; } @@ -14,7 +14,7 @@ @media screen and (-webkit-min-device-pixel-ratio:0) { @font-face { font-family: 'fontello'; - src: url('../font/fontello.svg?25380644#fontello') format('svg'); + src: url('../font/fontello.svg?43056661#fontello') format('svg'); } } */ @@ -52,6 +52,7 @@ .icon-dollar:before { content: '\e818'; } /* '' */ .icon-doc:before { content: '\e81b'; } /* '' */ +.icon-login:before { content: '\e81c'; } /* '' */ .icon-exchange:before { content: '\e81a'; } /* '' */ .icon-money:before { content: '\e819'; } /* '' */ .icon-mail:before { content: '\e814'; } /* '' */ @@ -69,7 +70,7 @@ .icon-bell:before { content: '\e817'; } /* '' */ .icon-trash:before { content: '\e812'; } /* '' */ .icon-cog:before { content: '\e810'; } /* '' */ -.icon-login:before { content: '\e81c'; } /* '' */ +.icon-search:before { content: '\e827'; } /* '' */ .icon-resize-full-alt:before { content: '\e824'; } /* '' */ .icon-down-open:before { content: '\e825'; } /* '' */ .icon-left-open:before { content: '\e801'; } /* '' */ diff --git a/public/site_assets/mpos/font/fontello.eot b/public/site_assets/mpos/font/fontello.eot index f5a0206b..77946028 100644 Binary files a/public/site_assets/mpos/font/fontello.eot and b/public/site_assets/mpos/font/fontello.eot differ diff --git a/public/site_assets/mpos/font/fontello.svg b/public/site_assets/mpos/font/fontello.svg index 547cd55b..8ce0855d 100644 --- a/public/site_assets/mpos/font/fontello.svg +++ b/public/site_assets/mpos/font/fontello.svg @@ -8,6 +8,7 @@ + @@ -25,7 +26,7 @@ - + diff --git a/public/site_assets/mpos/font/fontello.ttf b/public/site_assets/mpos/font/fontello.ttf index 1b026cab..a5417e26 100644 Binary files a/public/site_assets/mpos/font/fontello.ttf and b/public/site_assets/mpos/font/fontello.ttf differ diff --git a/public/site_assets/mpos/font/fontello.woff b/public/site_assets/mpos/font/fontello.woff index 2b52bb46..706ce384 100644 Binary files a/public/site_assets/mpos/font/fontello.woff and b/public/site_assets/mpos/font/fontello.woff differ diff --git a/public/templates/mmcFE/admin/user/default.tpl b/public/templates/mmcFE/admin/user/default.tpl index f8957d83..3acc8f2e 100644 --- a/public/templates/mmcFE/admin/user/default.tpl +++ b/public/templates/mmcFE/admin/user/default.tpl @@ -58,10 +58,10 @@ {$USERS[user].id} {$USERS[user].username|escape} {$USERS[user].email|escape} - {$USERS[user].shares} + {$USERS[user].shares.valid} {$USERS[user].hashrate} - {$USERS[user].payout.est_donation|number_format:"8"} - {$USERS[user].payout.est_payout|number_format:"8"} + {$USERS[user].estimates.donation|number_format:"8"} + {$USERS[user].estimates.payout|number_format:"8"} {$USERS[user].balance|number_format:"8"} diff --git a/public/templates/mmcFE/global/navigation.tpl b/public/templates/mmcFE/global/navigation.tpl index 82754506..490e15f5 100644 --- a/public/templates/mmcFE/global/navigation.tpl +++ b/public/templates/mmcFE/global/navigation.tpl @@ -33,6 +33,7 @@
  • Block Stats
  • Hashrate Graphs
  • Round Stats
  • +
  • Block Finder Stats
  • {if $GLOBAL.config.monitoring_uptimerobot_api_keys|default:"0"}
  • Uptime Stats
  • {/if} @@ -48,6 +49,9 @@ {if $GLOBAL.acl.round.statistics}
  • Round Stats
  • {/if} + {if $GLOBAL.acl.blockfinder.statistics} +
  • Block Finder Stats
  • + {/if} {if $GLOBAL.acl.uptime.statistics} {if $GLOBAL.config.monitoring_uptimerobot_api_keys|default:"0"}
  • Uptime Stats
  • {/if} {/if} @@ -55,11 +59,13 @@ {/if}
  • Getting Started
  • Support
  • + {if !$GLOBAL.website.about.disabled}
  • About + {/if}
  • {if $smarty.session.AUTHENTICATED|default == 1}
  • Logout
  • {else}
  • Register
  • {/if} diff --git a/public/templates/mmcFE/statistics/blockfinder/default.tpl b/public/templates/mmcFE/statistics/blockfinder/default.tpl new file mode 100644 index 00000000..e69de29b diff --git a/public/templates/mmcFE/statistics/blockfinder/finder.tpl b/public/templates/mmcFE/statistics/blockfinder/finder.tpl new file mode 100644 index 00000000..5be66452 --- /dev/null +++ b/public/templates/mmcFE/statistics/blockfinder/finder.tpl @@ -0,0 +1,4 @@ +{include file="statistics/blockfinder/finder_top.tpl"} +{if $smarty.session.AUTHENTICATED|default} +{include file="statistics/blockfinder/finder_own.tpl" ALIGN="right" SHORT=true} +{/if} \ No newline at end of file diff --git a/public/templates/mmcFE/statistics/blockfinder/finder_own.tpl b/public/templates/mmcFE/statistics/blockfinder/finder_own.tpl new file mode 100644 index 00000000..37ee988d --- /dev/null +++ b/public/templates/mmcFE/statistics/blockfinder/finder_own.tpl @@ -0,0 +1,25 @@ +{include file="global/block_header.tpl" ALIGN="right" BLOCK_HEADER="Blocks found by own Workers"} +
    + + + + + + + + + + +{assign var=rank value=1} +{section block $BLOCKSSOLVEDBYWORKER} + + + + + + +{/section} + +
    RankWorkerBlocksCoins Generated
    {$rank++}{$BLOCKSSOLVEDBYWORKER[block].finder|default:"unknown/deleted"|escape}{$BLOCKSSOLVEDBYWORKER[block].solvedblocks}{$BLOCKSSOLVEDBYWORKER[block].generatedcoins|number_format}
    +
    +{include file="global/block_footer.tpl"} diff --git a/public/templates/mmcFE/statistics/blockfinder/finder_top.tpl b/public/templates/mmcFE/statistics/blockfinder/finder_top.tpl new file mode 100644 index 00000000..aed95351 --- /dev/null +++ b/public/templates/mmcFE/statistics/blockfinder/finder_top.tpl @@ -0,0 +1,25 @@ +{include file="global/block_header.tpl" ALIGN="left" BLOCK_HEADER="Top 25 Blockfinder"} +
    + + + + + + + + + + +{assign var=rank value=1} +{section block $BLOCKSSOLVEDBYACCOUNT} + + + + + + +{/section} + +
    RankUsernameBlocksCoins Generated
    {$rank++}{if $BLOCKSSOLVEDBYACCOUNT[block].is_anonymous|default:"0" == 1 && $GLOBAL.userdata.is_admin|default:"0" == 0}anonymous{else}{$BLOCKSSOLVEDBYACCOUNT[block].finder|default:"unknown"|escape}{/if}{$BLOCKSSOLVEDBYACCOUNT[block].solvedblocks}{$BLOCKSSOLVEDBYACCOUNT[block].generatedcoins|number_format}
    +
    +{include file="global/block_footer.tpl"} diff --git a/public/templates/mpos/about/donors/disabled.tpl b/public/templates/mpos/about/donors/disabled.tpl new file mode 100644 index 00000000..e69de29b diff --git a/public/templates/mpos/about/pool/disabled.tpl b/public/templates/mpos/about/pool/disabled.tpl new file mode 100644 index 00000000..e69de29b diff --git a/public/templates/mpos/admin/user/default.tpl b/public/templates/mpos/admin/user/default.tpl index 0d69bd63..4a632696 100644 --- a/public/templates/mpos/admin/user/default.tpl +++ b/public/templates/mpos/admin/user/default.tpl @@ -51,10 +51,10 @@ {$USERS[user].id} {$USERS[user].username|escape} {$USERS[user].email|escape} - {$USERS[user].shares} + {$USERS[user].shares.valid} {$USERS[user].hashrate} - {$USERS[user].payout.est_donation|number_format:"8"} - {$USERS[user].payout.est_payout|number_format:"8"} + {$USERS[user].estimates.donation|number_format:"8"} + {$USERS[user].estimates.payout|number_format:"8"} {$USERS[user].balance|number_format:"8"} diff --git a/public/templates/mpos/dashboard/js.tpl b/public/templates/mpos/dashboard/js.tpl index 9862d4fc..663fe78f 100644 --- a/public/templates/mpos/dashboard/js.tpl +++ b/public/templates/mpos/dashboard/js.tpl @@ -140,7 +140,7 @@ $(document).ready(function(){ function refreshStaticData(data) { $('#b-confirmed').html(data.getdashboarddata.data.personal.balance.confirmed); $('#b-unconfirmed').html(data.getdashboarddata.data.personal.balance.unconfirmed); - $('#b-price').html((parseFloat(data.getdashboarddata.data.pool.price).toFixed(4))); + $('#b-price').html((parseFloat(data.getdashboarddata.data.pool.price).toFixed(8))); $('#b-dworkers').html(data.getdashboarddata.data.pool.workers); $('#b-hashrate').html((parseFloat(data.getdashboarddata.data.personal.hashrate).toFixed(2))); $('#b-sharerate').html((parseFloat(data.getdashboarddata.data.personal.sharerate).toFixed(2))); diff --git a/public/templates/mpos/global/navigation.tpl b/public/templates/mpos/global/navigation.tpl index 39c5ee84..9e8b0b08 100644 --- a/public/templates/mpos/global/navigation.tpl +++ b/public/templates/mpos/global/navigation.tpl @@ -33,6 +33,7 @@
  • Blocks
  • Graphs
  • Round
  • + {if $GLOBAL.config.monitoring_uptimerobot_api_keys|default:"0"}
  • Uptime
  • {/if} {else} @@ -49,6 +50,9 @@ {if $GLOBAL.acl.round.statistics}
  • Round
  • {/if} + {if $GLOBAL.acl.blockfinder.statistics} + + {/if} {if $GLOBAL.acl.uptime.statistics} {if $GLOBAL.config.monitoring_uptimerobot_api_keys|default:"0"}
  • Uptime
  • {/if} {/if} @@ -57,8 +61,12 @@

    Help

    Other

      diff --git a/public/templates/mpos/statistics/blockfinder/default.tpl b/public/templates/mpos/statistics/blockfinder/default.tpl new file mode 100644 index 00000000..e69de29b diff --git a/public/templates/mpos/statistics/blockfinder/finder.tpl b/public/templates/mpos/statistics/blockfinder/finder.tpl new file mode 100644 index 00000000..5be66452 --- /dev/null +++ b/public/templates/mpos/statistics/blockfinder/finder.tpl @@ -0,0 +1,4 @@ +{include file="statistics/blockfinder/finder_top.tpl"} +{if $smarty.session.AUTHENTICATED|default} +{include file="statistics/blockfinder/finder_own.tpl" ALIGN="right" SHORT=true} +{/if} \ No newline at end of file diff --git a/public/templates/mpos/statistics/blockfinder/finder_own.tpl b/public/templates/mpos/statistics/blockfinder/finder_own.tpl new file mode 100644 index 00000000..891ab3ed --- /dev/null +++ b/public/templates/mpos/statistics/blockfinder/finder_own.tpl @@ -0,0 +1,25 @@ +
      +

      Blocks found by own Workers

      +
      + + + + + + + + + + +{assign var=rank value=1} +{section block $BLOCKSSOLVEDBYWORKER} + + + + + + +{/section} + +
      RankWorkerBlocksCoins Generated
      {$rank++}{$BLOCKSSOLVEDBYWORKER[block].finder|default:"unknown/deleted"|escape}{$BLOCKSSOLVEDBYWORKER[block].solvedblocks}{$BLOCKSSOLVEDBYWORKER[block].generatedcoins|number_format}
      +
      diff --git a/public/templates/mpos/statistics/blockfinder/finder_top.tpl b/public/templates/mpos/statistics/blockfinder/finder_top.tpl new file mode 100644 index 00000000..853a3dc2 --- /dev/null +++ b/public/templates/mpos/statistics/blockfinder/finder_top.tpl @@ -0,0 +1,25 @@ +
      +

      Top 25 Blockfinder

      +
      + + + + + + + + + + +{assign var=rank value=1} +{section block $BLOCKSSOLVEDBYACCOUNT} + + + + + + +{/section} + +
      RankUsernameBlocksCoins Generated
      {$rank++}{if $BLOCKSSOLVEDBYACCOUNT[block].is_anonymous|default:"0" == 1 && $GLOBAL.userdata.is_admin|default:"0" == 0}anonymous{else}{$BLOCKSSOLVEDBYACCOUNT[block].finder|default:"unknown"|escape}{/if}{$BLOCKSSOLVEDBYACCOUNT[block].solvedblocks}{$BLOCKSSOLVEDBYACCOUNT[block].generatedcoins|number_format}
      +
      diff --git a/sql/000_base_structure.sql b/sql/000_base_structure.sql index 8dee379b..220b55c9 100644 --- a/sql/000_base_structure.sql +++ b/sql/000_base_structure.sql @@ -40,6 +40,7 @@ CREATE TABLE IF NOT EXISTS `blocks` ( `time` int(11) NOT NULL, `accounted` tinyint(1) NOT NULL DEFAULT '0', `account_id` int(255) unsigned DEFAULT NULL, + `worker_name` varchar(50) DEFAULT 'unknown', `shares` int(255) unsigned DEFAULT NULL, `share_id` int(255) DEFAULT NULL, PRIMARY KEY (`id`), diff --git a/sql/004_blocks_worker.sql b/sql/004_blocks_worker.sql new file mode 100644 index 00000000..bc1e147c --- /dev/null +++ b/sql/004_blocks_worker.sql @@ -0,0 +1 @@ +ALTER TABLE `blocks` ADD `worker_name` varchar(50) DEFAULT 'unknown' AFTER `account_id`; \ No newline at end of file