Merge pull request #2075 from MPOS/development

UPDATE : Development to Master - RC1
This commit is contained in:
Sebastian Grewe 2014-04-08 16:31:47 +02:00
commit d895e9a8bf
58 changed files with 1369 additions and 783 deletions

View File

@ -46,10 +46,10 @@ if (!$dWalletBalance = $bitcoin->getrealbalance())
// Fetch unconfirmed amount from blocks table
empty($config['network_confirmations']) ? $confirmations = 120 : $confirmations = $config['network_confirmations'];
$aBlocksUnconfirmed = $block->getAllUnconfirmed($confirmations);
$dBlocksUnconfirmedBalance = 0;
if (!empty($aBlocksUnconfirmed))foreach ($aBlocksUnconfirmed as $aData) $dBlocksUnconfirmedBalance += $aData['amount'];
if ($config['getbalancewithunconfirmed']) {
$aBlocksUnconfirmed = $block->getAllUnconfirmed($confirmations);
$dBlocksUnconfirmedBalance = 0;
if (!empty($aBlocksUnconfirmed))foreach ($aBlocksUnconfirmed as $aData) $dBlocksUnconfirmedBalance += $aData['amount'];
$dWalletBalance -= $dBlocksUnconfirmedBalance;
}
// Fetch Newmint
@ -133,10 +133,10 @@ if (!$dWalletBalance = $bitcoin->getrealbalance())
// Fetch unconfirmed amount from blocks table
empty($config['network_confirmations']) ? $confirmations = 120 : $confirmations = $config['network_confirmations'];
$aBlocksUnconfirmed = $block->getAllUnconfirmed($confirmations);
$dBlocksUnconfirmedBalance = 0;
if (!empty($aBlocksUnconfirmed))foreach ($aBlocksUnconfirmed as $aData) $dBlocksUnconfirmedBalance += $aData['amount'];
if ($config['getbalancewithunconfirmed']) {
$aBlocksUnconfirmed = $block->getAllUnconfirmed($confirmations);
$dBlocksUnconfirmedBalance = 0;
if (!empty($aBlocksUnconfirmed))foreach ($aBlocksUnconfirmed as $aData) $dBlocksUnconfirmedBalance += $aData['amount'];
$dWalletBalance -= $dBlocksUnconfirmedBalance;
}
// Fetch Newmint

View File

@ -47,13 +47,22 @@ class CoinBase extends Base {
* Calculate our networks expected time per block
**/
public function calcNetworkExpectedTimePerBlock($dDifficulty, $dNetworkHashrate) {
return pow(2, 32) * $dDifficulty / $dNetworkHashrate;
if ($dNetworkHashrate > 0) {
return pow(2, 32) * $dDifficulty / $dNetworkHashrate;
} else {
return 0;
}
}
/**
* Calculate next expected difficulty based on current difficulty
**/
public function calcExpectedNextDifficulty($dDifficulty, $dNetworkHashrate) {
return round($dDifficulty * $this->config['cointarget'] / $this->calcNetworkExpectedTimePerBlock($dDifficulty, $dNetworkHashrate), 8);
$iExpectedTimePerBlock = $this->calcNetworkExpectedTimePerBlock($dDifficulty, $dNetworkHashrate);
if (!empty($iExpectedTimePerBlock) && $iExpectedTimePerBlock > 0) {
return round($dDifficulty * $this->config['cointarget'] / $iExpectedTimePerBlock, 8);
} else {
return 0;
}
}
}

View File

@ -34,7 +34,7 @@ class Mail extends Base {
$aData['senderEmail'] = $senderEmail;
$aData['senderSubject'] = $senderSubject;
$aData['senderMessage'] = $senderMessage;
$aData['email'] = $this->setting->getValue('website_email');
$aData['email'] = $this->setting->getValue('website_email', 'test@example.com');
$aData['subject'] = 'Contact Form';
if ($this->sendMail('contactform/body', $aData)) {
return true;
@ -52,7 +52,7 @@ class Mail extends Base {
* subject : Mail Subject
* email : Destination address
**/
public function sendMail($template, $aData) {
public function sendMail($template, $aData, $throttle=false) {
// Prepare SMTP transport and mailer
$transport_type = $this->config['swiftmailer']['type'];
if ($transport_type == 'sendmail') {
@ -65,6 +65,14 @@ class Mail extends Base {
}
}
$mailer = Swift_Mailer::newInstance($transport);
// Throttle mails to x per minute, used for newsletter for example
if ($this->config['swiftmailer']['type'] == 'smtp' && $throttle) {
$mailer->registerPlugin(new Swift_Plugins_ThrottlerPlugin(
$this->config['switfmailer']['smtp']['throttle'], Swift_Plugins_ThrottlerPlugin::MESSAGES_PER_MINUTE
));
}
// Prepare the smarty templates used
$this->smarty->clearCache(BASEPATH . 'templates/mail/' . $template . '.tpl');
$this->smarty->clearCache(BASEPATH . 'templates/mail/subject.tpl');
@ -73,14 +81,20 @@ class Mail extends Base {
$this->smarty->assign('DATA', $aData);
// Create new message for Swiftmailer
$senderEmail = $this->setting->getValue('website_email', 'test@example.com');
$senderName = $this->setting->getValue('website_name', 'test@example.com');
$message = Swift_Message::newInstance()
->setSubject($this->smarty->fetch(BASEPATH . 'templates/mail/subject.tpl'))
->setFrom(array( $this->setting->getValue('website_email') => $this->setting->getValue('website_name')))
->setFrom(array( $senderEmail => $senderName))
->setTo($aData['email'])
->setSender($this->setting->getValue('website_email'))
->setReturnPath($this->setting->getValue('website_email'))
->setSender($senderEmail)
->setReturnPath($senderEmail)
->setBody($this->smarty->fetch(BASEPATH . 'templates/mail/' . $template . '.tpl'), 'text/html');
if (strlen(@$aData['senderName']) > 0 && @strlen($aData['senderEmail']) > 0 )
if (isset($aData['senderName']) &&
isset($aData['senderEmail']) &&
strlen($aData['senderName']) > 0 &&
strlen($aData['senderEmail']) > 0 &&
filter_var($aData['senderEmail'], FILTER_VALIDATE_EMAIL))
$message->setReplyTo(array($aData['senderEmail'] => $aData['senderName']));
// Send message out with configured transport

View File

@ -72,13 +72,26 @@ class Notification extends Mail {
* @return array Notification settings
**/
public function getNotificationSettings($account_id) {
// Some defaults, we cover them here so we can avoid adding default settings on user creation
$aDefaults = array( 'newsletter' => 1 );
$this->debug->append("STA " . __METHOD__, 4);
$stmt = $this->mysqli->prepare("SELECT * FROM $this->tableSettings WHERE account_id = ?");
if ($stmt && $stmt->bind_param('i', $account_id) && $stmt->execute() && $result = $stmt->get_result()) {
if ($result->num_rows > 0) {
$aFound = array();
while ($row = $result->fetch_assoc()) {
if (array_key_exists($row['type'], $aDefaults)) $aFound[] = $row['type'];
$aData[$row['type']] = $row['active'];
}
// Check found types against our defaults, set if required
foreach ($aDefaults as $type => $value) {
if (!in_array($type, $aFound)) {
$aData[$type] = $value;
}
}
return $aData;
} else {
foreach ($aDefaults as $type => $value) $aData[$type] = $value;
return $aData;
}
}

View File

@ -150,8 +150,8 @@ class Transaction extends Base {
IFNULL(SUM(IF(t.type = 'TXFee' AND timestamp >= DATE_SUB(now(), INTERVAL 31536000 SECOND), t.amount, 0)), 0) AS 1YearTXFee,
IFNULL(SUM(IF(t.type = 'Fee' AND timestamp >= DATE_SUB(now(), INTERVAL 31536000 SECOND), t.amount, 0)), 0) AS 1YearFee,
IFNULL(SUM(IF(t.type = 'Donation' AND timestamp >= DATE_SUB(now(), INTERVAL 31536000 SECOND), t.amount, 0)), 0) AS 1YearDonation
FROM transactions AS t
LEFT OUTER JOIN blocks AS b ON b.id = t.block_id
FROM $this->table AS t
LEFT OUTER JOIN " . $this->block->getTableName() . " AS b ON b.id = t.block_id
WHERE
t.account_id = ? AND (b.confirmations > 0 OR b.id IS NULL)");
if ($this->checkStmt($stmt) && $stmt->bind_param("i", $account_id) && $stmt->execute() && $result = $stmt->get_result())

View File

@ -192,6 +192,11 @@ class User extends Base {
return false;
}
if ($this->checkUserPassword($username, $password)) {
// delete notification cookies
setcookie("motd-box", "", time()-3600);
setcookie("lastlogin-box", "", time()-3600);
setcookie("backend-box", "", time()-3600);
// rest of login process
$uid = $this->getUserId($username);
$lastLoginTime = $this->getLastLogin($uid);
$this->updateLoginTimestamp($uid);

View File

@ -272,6 +272,20 @@ $aSettings['acl'][] = array(
'name' => 'acl_chat_page', 'value' => $setting->getValue('acl_chat_page'),
'tooltip' => 'Make the chat page private (users only) or public.'
);
$aSettings['acl'][] = array(
'display' => 'MOOT Forum Page', 'type' => 'select',
'options' => array( 0 => 'Private', 1 => 'Public', 2 => 'Disabled' ),
'default' => 2,
'name' => 'acl_moot_forum', 'value' => $setting->getValue('acl_moot_forum'),
'tooltip' => 'Make the forum page private (users only) or public.'
);
$aSettings['acl'][] = array(
'display' => 'QRCode', 'type' => 'select',
'options' => array( 0 => 'Enabled', 1 => 'Disabled' ),
'default' => 0,
'name' => 'acl_qrcode', 'value' => $setting->getValue('acl_qrcode'),
'tooltip' => 'Hide or Show the QRCode Page.'
);
$aSettings['system'][] = array(
'display' => 'E-mail address for system error notifications', 'type' => 'text',
'size' => 25,
@ -370,6 +384,13 @@ $aSettings['system'][] = array(
'name' => 'system_irc_chat', 'value' => $setting->getValue('system_irc_chat'),
'tooltip' => 'Your IRC support channel name.'
);
$aSettings['system'][] = array(
'display' => 'Moot Forum Channel', 'type' => 'text',
'size' => 25,
'default' => 'lazypoolop',
'name' => 'system_moot_forum', 'value' => $setting->getValue('system_moot_forum'),
'tooltip' => 'Your MOOT support forum name.'
);
$aSettings['recaptcha'][] = array(
'display' => 'Enable re-Captcha', 'type' => 'select',
'options' => array( 0 => 'No', 1 => 'Yes' ),
@ -447,6 +468,13 @@ $aSettings['notifications'][] = array(
'name' => 'notifications_disable_idle_worker', 'value' => $setting->getValue('notifications_disable_idle_worker'),
'tooltip' => 'Enable/Disable IDLE worker notifications globally. Will remove the user option too.'
);
$aSettings['notifications'][] = array(
'display' => 'Disable Pool Newsletter', 'type' => 'select',
'options' => array( 0 => 'No', 1 => 'Yes'),
'default' => 0,
'name' => 'notifications_disable_pool_newsletter', 'value' => $setting->getValue('notifications_disable_pool_newsletter'),
'tooltip' => 'Enable/Disable pool newsletter globally. Will remove the user option too.'
);
$aSettings['pools'][] = array(
'display' => 'Enable Pool Navigation', 'type' => 'select',
'options' => array( 0 => 'No', 1 => 'Yes' ),

View File

@ -70,6 +70,7 @@ $config['switfmailer']['smtp']['port'] = '587';
$config['switfmailer']['smtp']['encryption'] = 'tls';
$config['switfmailer']['smtp']['username'] = '';
$config['switfmailer']['smtp']['password'] = '';
$config['switfmailer']['smtp']['throttle'] = 100;
/**
* Getting Started Config

View File

@ -0,0 +1,20 @@
<?php
$defflip = (!cfip()) ? exit(header('HTTP/1.1 401 Unauthorized')) : 1;
// ACL check
switch($setting->getValue('acl_moot_forum', 2)) {
case '0':
if ($user->isAuthenticated()) {
$smarty->assign('CHATROOM', $setting->getValue('system_moot_forum', 'lazypoolop'));
$smarty->assign("CONTENT", "default.tpl");
}
break;
case '1':
$smarty->assign('CHATROOM', $setting->getValue('system_moot_forum', 'lazypoolop'));
$smarty->assign("CONTENT", "default.tpl");
break;
case '2':
$_SESSION['POPUP'][] = array('CONTENT' => 'Page currently disabled. Please try again later.', 'TYPE' => 'alert alert-danger');
$smarty->assign("CONTENT", "disabled.tpl");
break;
}

View File

@ -12,52 +12,54 @@ $updating = (@$_POST['do']) ? 1 : 0;
if ($user->isAuthenticated()) {
if ($config['twofactor']['enabled']) {
$popupmsg = 'E-mail confirmations are required for ';
$popuptypes = array();
if ($config['twofactor']['options']['details'] && $oldtoken_ea !== "") {
$popuptypes[] = 'editing your details';
$ea_editable = $user->token->isTokenValid($_SESSION['USERDATA']['id'], $oldtoken_ea, 5);
$ea_sent = $user->token->doesTokenExist('account_edit', $_SESSION['USERDATA']['id']);
}
if ($config['twofactor']['options']['changepw'] && $oldtoken_cp !== "") {
$popuptypes[] = 'changing your password';
$cp_editable = $user->token->isTokenValid($_SESSION['USERDATA']['id'], $oldtoken_cp, 6);
$cp_sent = $user->token->doesTokenExist('change_pw', $_SESSION['USERDATA']['id']);
}
if ($config['twofactor']['options']['withdraw'] && $oldtoken_wf !== "") {
$popuptypes[] = 'withdrawals';
$wf_editable = $user->token->isTokenValid($_SESSION['USERDATA']['id'], $oldtoken_wf, 7);
$wf_sent = $user->token->doesTokenExist('withdraw_funds', $_SESSION['USERDATA']['id']);
}
// get the status of a token if set
$message_tokensent_invalid = 'A token was sent to your e-mail that will allow you to ';
$message_tokensent_valid = 'You can currently ';
$messages_tokensent_status = array(
'ea' => 'edit your account details',
'wf' => 'withdraw funds',
'cp' => 'change your password'
);
// build the message we're going to show them for their token(s)
$eaprep_sent = ($ea_sent) ? $message_tokensent_valid.$messages_tokensent_status['ea'] : "";
$eaprep_edit = ($ea_editable) ? $message_tokensent_invalid.$messages_tokensent_status['ea'] : "";
$wfprep_sent = ($wf_sent) ? $message_tokensent_valid.$messages_tokensent_status['wf'] : "";
$wfprep_edit = ($wf_editable) ? $message_tokensent_invalid.$messages_tokensent_status['wf'] : "";
$cpprep_sent = ($cp_sent) ? $message_tokensent_valid.$messages_tokensent_status['cp'] : "";
$cpprep_edit = ($cp_editable) ? $message_tokensent_invalid.$messages_tokensent_status['cp'] : "";
$ptc = 0;
$ptcn = count($popuptypes);
foreach ($popuptypes as $pt) {
if ($ptcn == 1) { $popupmsg.= $popuptypes[$ptc]; continue; }
if ($ptc !== ($ptcn-1)) {
$popupmsg.= $popuptypes[$ptc].', ';
} else {
$popupmsg.= 'and '.$popuptypes[$ptc];
if ($config['twofactor']['options']['details'] OR $config['twofactor']['options']['changepw'] OR $config['twofactor']['options']['withdraw']) {
$popupmsg = 'E-mail confirmations are required for ';
$popuptypes = array();
if ($config['twofactor']['options']['details'] && $oldtoken_ea !== "") {
$popuptypes[] = 'editing your details';
$ea_editable = $user->token->isTokenValid($_SESSION['USERDATA']['id'], $oldtoken_ea, 5);
$ea_sent = $user->token->doesTokenExist('account_edit', $_SESSION['USERDATA']['id']);
}
$ptc++;
if ($config['twofactor']['options']['changepw'] && $oldtoken_cp !== "") {
$popuptypes[] = 'changing your password';
$cp_editable = $user->token->isTokenValid($_SESSION['USERDATA']['id'], $oldtoken_cp, 6);
$cp_sent = $user->token->doesTokenExist('change_pw', $_SESSION['USERDATA']['id']);
}
if ($config['twofactor']['options']['withdraw'] && $oldtoken_wf !== "") {
$popuptypes[] = 'withdrawals';
$wf_editable = $user->token->isTokenValid($_SESSION['USERDATA']['id'], $oldtoken_wf, 7);
$wf_sent = $user->token->doesTokenExist('withdraw_funds', $_SESSION['USERDATA']['id']);
}
// get the status of a token if set
$message_tokensent_invalid = 'A token was sent to your e-mail that will allow you to ';
$message_tokensent_valid = 'You can currently ';
$messages_tokensent_status = array(
'ea' => 'edit your account details',
'wf' => 'withdraw funds',
'cp' => 'change your password'
);
// build the message we're going to show them for their token(s)
$eaprep_sent = ($ea_sent) ? $message_tokensent_valid.$messages_tokensent_status['ea'] : "";
$eaprep_edit = ($ea_editable) ? $message_tokensent_invalid.$messages_tokensent_status['ea'] : "";
$wfprep_sent = ($wf_sent) ? $message_tokensent_valid.$messages_tokensent_status['wf'] : "";
$wfprep_edit = ($wf_editable) ? $message_tokensent_invalid.$messages_tokensent_status['wf'] : "";
$cpprep_sent = ($cp_sent) ? $message_tokensent_valid.$messages_tokensent_status['cp'] : "";
$cpprep_edit = ($cp_editable) ? $message_tokensent_invalid.$messages_tokensent_status['cp'] : "";
$ptc = 0;
$ptcn = count($popuptypes);
foreach ($popuptypes as $pt) {
if ($ptcn == 1) { $popupmsg.= $popuptypes[$ptc]; continue; }
if ($ptc !== ($ptcn-1)) {
$popupmsg.= $popuptypes[$ptc].', ';
} else {
$popupmsg.= 'and '.$popuptypes[$ptc];
}
$ptc++;
}
// display global notice about tokens being in use and for which bits they're active
$_SESSION['POPUP'][] = array('CONTENT' => $popupmsg, 'TYPE' => 'alert alert-warning');
}
// display global notice about tokens being in use and for which bits they're active
$_SESSION['POPUP'][] = array('CONTENT' => $popupmsg, 'TYPE' => 'alert alert-warning');
}
if (isset($_POST['do']) && $_POST['do'] == 'genPin') {
@ -174,12 +176,12 @@ if ($config['twofactor']['enabled'] && $user->isAuthenticated()) {
}
// display token info per each - only when sent and editable or just sent, not by default
(!empty($eaprep_sent) && !empty($eaprep_edit)) ? $_SESSION['POPUP'][] = array('CONTENT' => $eaprep_sent, 'TYPE' => 'success'):"";
(!empty($eaprep_sent) && empty($eaprep_edit)) ? $_SESSION['POPUP'][] = array('CONTENT' => $message_tokensent_invalid.$messages_tokensent_status['ea'], 'TYPE' => 'success'):"";
(!empty($wfprep_sent) && !empty($wfprep_edit)) ? $_SESSION['POPUP'][] = array('CONTENT' => $wfprep_sent, 'TYPE' => 'success'):"";
(!empty($wfprep_sent) && empty($wfprep_edit)) ? $_SESSION['POPUP'][] = array('CONTENT' => $message_tokensent_invalid.$messages_tokensent_status['wf'], 'TYPE' => 'success'):"";
(!empty($cpprep_sent) && !empty($cpprep_edit)) ? $_SESSION['POPUP'][] = array('CONTENT' => $cpprep_sent, 'TYPE' => 'success'):"";
(!empty($cpprep_sent) && empty($cpprep_edit)) ? $_SESSION['POPUP'][] = array('CONTENT' => $message_tokensent_invalid.$messages_tokensent_status['cp'], 'TYPE' => 'success'):"";
(!empty($eaprep_sent) && !empty($eaprep_edit)) ? $_SESSION['POPUP'][] = array('CONTENT' => $eaprep_sent, 'TYPE' => 'alert alert-success'):"";
(!empty($eaprep_sent) && empty($eaprep_edit)) ? $_SESSION['POPUP'][] = array('CONTENT' => $message_tokensent_invalid.$messages_tokensent_status['ea'], 'TYPE' => 'alert alert-success'):"";
(!empty($wfprep_sent) && !empty($wfprep_edit)) ? $_SESSION['POPUP'][] = array('CONTENT' => $wfprep_sent, 'TYPE' => 'alert alert-success'):"";
(!empty($wfprep_sent) && empty($wfprep_edit)) ? $_SESSION['POPUP'][] = array('CONTENT' => $message_tokensent_invalid.$messages_tokensent_status['wf'], 'TYPE' => 'alert alert-success'):"";
(!empty($cpprep_sent) && !empty($cpprep_edit)) ? $_SESSION['POPUP'][] = array('CONTENT' => $cpprep_sent, 'TYPE' => 'alert alert-success'):"";
(!empty($cpprep_sent) && empty($cpprep_edit)) ? $_SESSION['POPUP'][] = array('CONTENT' => $message_tokensent_invalid.$messages_tokensent_status['cp'], 'TYPE' => 'alert alert-success'):"";
// two-factor stuff
$smarty->assign("CHANGEPASSUNLOCKED", $cp_editable);
$smarty->assign("WITHDRAWUNLOCKED", $wf_editable);

View File

@ -25,6 +25,7 @@ if ($user->isAuthenticated()) {
// Fetch global settings
$smarty->assign('DISABLE_BLOCKNOTIFICATIONS', $setting->getValue('notifications_disable_block'));
$smarty->assign('DISABLE_IDLEWORKERNOTIFICATIONS', $setting->getValue('notifications_disable_idle_worker'));
$smarty->assign('DISABLE_POOLNEWSLETTER', $setting->getValue('notifications_disable_pool_newsletter'));
// Fetch user notification settings
$aSettings = $notification->getNotificationSettings($_SESSION['USERDATA']['id']);

View File

@ -1,5 +1,15 @@
<?php
$defflip = (!cfip()) ? exit(header('HTTP/1.1 401 Unauthorized')) : 1;
if ($user->isAuthenticated()) $smarty->assign("CONTENT", "default.tpl");
switch($setting->getValue('acl_qrcode')) {
case '0':
if ($user->isAuthenticated()) {
$smarty->assign("CONTENT", "default.tpl");
}
break;
case '1':
$_SESSION['POPUP'][] = array('CONTENT' => 'Page currently disabled. Please try again later.', 'TYPE' => 'alert alert-danger');
$smarty->assign("CONTENT", "");
break;
}
?>

View File

@ -0,0 +1,41 @@
<?php
$defflip = (!cfip()) ? exit(header('HTTP/1.1 401 Unauthorized')) : 1;
// Check user to ensure they are admin
if (!$user->isAuthenticated() || !$user->isAdmin($_SESSION['USERDATA']['id'])) {
header("HTTP/1.1 404 Page not found");
die("404 Page not found");
}
// Include markdown library
use \Michelf\Markdown;
if ($setting->getValue('notifications_disable_pool_newsletter', 0) == 1) {
$_SESSION['POPUP'][] = array('CONTENT' => 'Pool newsletters are disabled.', 'TYPE' => 'alert alert-info');
$smarty->assign("CONTENT", "");
} else {
if (@$_REQUEST['do'] == 'send') {
if (!$config['csrf']['enabled'] || $config['csrf']['enabled'] && $csrftoken->valid) {
$iFailed = 0;
$iSuccess = 0;
foreach ($user->getAllAssoc() as $aData) {
$aUserNotificationSettings = $notification->getNotificationSettings($aData['id']);
if ($aData['is_locked'] != 0 || $aUserNotificationSettings['newsletter'] != 1) continue;
$aData['subject'] = $_REQUEST['data']['subject'];
$aData['CONTENT'] = $_REQUEST['data']['content'];
if (!$mail->sendMail('newsletter/body', $aData, true)) {
$iFailed++;
} else {
$iSuccess++;
}
}
$_SESSION['POPUP'][] = array('CONTENT' => 'Newsletter sent to ' . $iSuccess . ' users.', 'TYPE' => 'alert alert-success');
if ($iFailed > 0)
$_SESSION['POPUP'][] = array('CONTENT' => 'Failed to send e-mail to ' . $iFailed . ' users. ', 'TYPE' => 'alert alert-info');
} else {
$_SESSION['POPUP'][] = array('CONTENT' => $csrftoken->getErrorWithDescriptionHTML(), 'TYPE' => 'alert alert-warning');
}
}
$smarty->assign("CONTENT", "default.tpl");
}
?>

View File

@ -34,6 +34,8 @@ if ($iCurrentPoolHashrate > $dNetworkHashrate) $dNetworkHashrate = $iCurrentPool
// Time in seconds, not hours, using modifier in smarty to translate
$iCurrentPoolHashrate > 0 ? $iEstTime = $dDifficulty * pow(2,32) / ($iCurrentPoolHashrate * 1000) : $iEstTime = 0;
$iEstShares = $statistics->getEstimatedShares($dDifficulty);
// For mpos-bot PoolLuck
$iEstShares > 0 && $aShares['valid'] > 0 ? $dEstPercent = round(100 / $iEstShares * $aShares['valid'], 2) : $dEstPercent = 0;
// Time since last
$now = new DateTime( "now" );
@ -48,6 +50,7 @@ $data = array(
'pool_name' => $setting->getValue('website_name'),
'hashrate' => $iCurrentPoolHashrate,
'efficiency' => $dEfficiency,
'progress' => $dEstPercent,
'workers' => $worker->getCountAllActiveWorkers(),
'currentnetworkblock' => $iBlock,
'nextnetworkblock' => $iBlock + 1,

View File

@ -133,6 +133,8 @@ $aGlobal['acl']['donors']['page'] = $setting->getValue('acl_donors_page');
$aGlobal['acl']['about']['page'] = $setting->getValue('acl_about_page');
$aGlobal['acl']['contactform'] = $setting->getValue('acl_contactform');
$aGlobal['acl']['chat']['page'] = $setting->getValue('acl_chat_page', 2);
$aGlobal['acl']['moot']['forum'] = $setting->getValue('acl_moot_forum', 2);
$aGlobal['acl']['qrcode'] = $setting->getValue('acl_qrcode');
// We don't want these session infos cached
if (@$_SESSION['USERDATA']['id']) {

View File

@ -43,6 +43,10 @@ a:focus {
border-color: #A2BCF5;
}
.panel .panel-default {
background-color: #3E6CCF;
}
.lightblue {
background-color: #3065D9;
}

View File

@ -43,6 +43,10 @@ a:focus {
border-color: #222222;
}
.panel .panel-default {
background-color: #D3D3D3;
}
.lightblue {
background-color: #222222;
}
@ -134,3 +138,7 @@ a:focus {
.dropdown-menu {
background-color: #D3D3D3;
}
.confirmations {
color: #F3FF12;
}

View File

@ -43,6 +43,10 @@ a:focus {
border-color: #167A1D;
}
.panel .panel-default {
background-color: #65B058;
}
.lightblue {
background-color: #167A1D;
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,269 @@
/*
* jQuery MD5 Plugin 1.2.1
* https://github.com/blueimp/jQuery-MD5
*
* Copyright 2010, Sebastian Tschan
* https://blueimp.net
*
* Licensed under the MIT license:
* http://creativecommons.org/licenses/MIT/
*
* Based on
* A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
* Digest Algorithm, as defined in RFC 1321.
* Version 2.2 Copyright (C) Paul Johnston 1999 - 2009
* Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
* Distributed under the BSD License
* See http://pajhome.org.uk/crypt/md5 for more info.
*/
/*jslint bitwise: true */
/*global unescape, jQuery */
(function ($) {
'use strict';
/*
* Add integers, wrapping at 2^32. This uses 16-bit operations internally
* to work around bugs in some JS interpreters.
*/
function safe_add(x, y) {
var lsw = (x & 0xFFFF) + (y & 0xFFFF),
msw = (x >> 16) + (y >> 16) + (lsw >> 16);
return (msw << 16) | (lsw & 0xFFFF);
}
/*
* Bitwise rotate a 32-bit number to the left.
*/
function bit_rol(num, cnt) {
return (num << cnt) | (num >>> (32 - cnt));
}
/*
* These functions implement the four basic operations the algorithm uses.
*/
function md5_cmn(q, a, b, x, s, t) {
return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s), b);
}
function md5_ff(a, b, c, d, x, s, t) {
return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);
}
function md5_gg(a, b, c, d, x, s, t) {
return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);
}
function md5_hh(a, b, c, d, x, s, t) {
return md5_cmn(b ^ c ^ d, a, b, x, s, t);
}
function md5_ii(a, b, c, d, x, s, t) {
return md5_cmn(c ^ (b | (~d)), a, b, x, s, t);
}
/*
* Calculate the MD5 of an array of little-endian words, and a bit length.
*/
function binl_md5(x, len) {
/* append padding */
x[len >> 5] |= 0x80 << ((len) % 32);
x[(((len + 64) >>> 9) << 4) + 14] = len;
var i, olda, oldb, oldc, oldd,
a = 1732584193,
b = -271733879,
c = -1732584194,
d = 271733878;
for (i = 0; i < x.length; i += 16) {
olda = a;
oldb = b;
oldc = c;
oldd = d;
a = md5_ff(a, b, c, d, x[i], 7, -680876936);
d = md5_ff(d, a, b, c, x[i + 1], 12, -389564586);
c = md5_ff(c, d, a, b, x[i + 2], 17, 606105819);
b = md5_ff(b, c, d, a, x[i + 3], 22, -1044525330);
a = md5_ff(a, b, c, d, x[i + 4], 7, -176418897);
d = md5_ff(d, a, b, c, x[i + 5], 12, 1200080426);
c = md5_ff(c, d, a, b, x[i + 6], 17, -1473231341);
b = md5_ff(b, c, d, a, x[i + 7], 22, -45705983);
a = md5_ff(a, b, c, d, x[i + 8], 7, 1770035416);
d = md5_ff(d, a, b, c, x[i + 9], 12, -1958414417);
c = md5_ff(c, d, a, b, x[i + 10], 17, -42063);
b = md5_ff(b, c, d, a, x[i + 11], 22, -1990404162);
a = md5_ff(a, b, c, d, x[i + 12], 7, 1804603682);
d = md5_ff(d, a, b, c, x[i + 13], 12, -40341101);
c = md5_ff(c, d, a, b, x[i + 14], 17, -1502002290);
b = md5_ff(b, c, d, a, x[i + 15], 22, 1236535329);
a = md5_gg(a, b, c, d, x[i + 1], 5, -165796510);
d = md5_gg(d, a, b, c, x[i + 6], 9, -1069501632);
c = md5_gg(c, d, a, b, x[i + 11], 14, 643717713);
b = md5_gg(b, c, d, a, x[i], 20, -373897302);
a = md5_gg(a, b, c, d, x[i + 5], 5, -701558691);
d = md5_gg(d, a, b, c, x[i + 10], 9, 38016083);
c = md5_gg(c, d, a, b, x[i + 15], 14, -660478335);
b = md5_gg(b, c, d, a, x[i + 4], 20, -405537848);
a = md5_gg(a, b, c, d, x[i + 9], 5, 568446438);
d = md5_gg(d, a, b, c, x[i + 14], 9, -1019803690);
c = md5_gg(c, d, a, b, x[i + 3], 14, -187363961);
b = md5_gg(b, c, d, a, x[i + 8], 20, 1163531501);
a = md5_gg(a, b, c, d, x[i + 13], 5, -1444681467);
d = md5_gg(d, a, b, c, x[i + 2], 9, -51403784);
c = md5_gg(c, d, a, b, x[i + 7], 14, 1735328473);
b = md5_gg(b, c, d, a, x[i + 12], 20, -1926607734);
a = md5_hh(a, b, c, d, x[i + 5], 4, -378558);
d = md5_hh(d, a, b, c, x[i + 8], 11, -2022574463);
c = md5_hh(c, d, a, b, x[i + 11], 16, 1839030562);
b = md5_hh(b, c, d, a, x[i + 14], 23, -35309556);
a = md5_hh(a, b, c, d, x[i + 1], 4, -1530992060);
d = md5_hh(d, a, b, c, x[i + 4], 11, 1272893353);
c = md5_hh(c, d, a, b, x[i + 7], 16, -155497632);
b = md5_hh(b, c, d, a, x[i + 10], 23, -1094730640);
a = md5_hh(a, b, c, d, x[i + 13], 4, 681279174);
d = md5_hh(d, a, b, c, x[i], 11, -358537222);
c = md5_hh(c, d, a, b, x[i + 3], 16, -722521979);
b = md5_hh(b, c, d, a, x[i + 6], 23, 76029189);
a = md5_hh(a, b, c, d, x[i + 9], 4, -640364487);
d = md5_hh(d, a, b, c, x[i + 12], 11, -421815835);
c = md5_hh(c, d, a, b, x[i + 15], 16, 530742520);
b = md5_hh(b, c, d, a, x[i + 2], 23, -995338651);
a = md5_ii(a, b, c, d, x[i], 6, -198630844);
d = md5_ii(d, a, b, c, x[i + 7], 10, 1126891415);
c = md5_ii(c, d, a, b, x[i + 14], 15, -1416354905);
b = md5_ii(b, c, d, a, x[i + 5], 21, -57434055);
a = md5_ii(a, b, c, d, x[i + 12], 6, 1700485571);
d = md5_ii(d, a, b, c, x[i + 3], 10, -1894986606);
c = md5_ii(c, d, a, b, x[i + 10], 15, -1051523);
b = md5_ii(b, c, d, a, x[i + 1], 21, -2054922799);
a = md5_ii(a, b, c, d, x[i + 8], 6, 1873313359);
d = md5_ii(d, a, b, c, x[i + 15], 10, -30611744);
c = md5_ii(c, d, a, b, x[i + 6], 15, -1560198380);
b = md5_ii(b, c, d, a, x[i + 13], 21, 1309151649);
a = md5_ii(a, b, c, d, x[i + 4], 6, -145523070);
d = md5_ii(d, a, b, c, x[i + 11], 10, -1120210379);
c = md5_ii(c, d, a, b, x[i + 2], 15, 718787259);
b = md5_ii(b, c, d, a, x[i + 9], 21, -343485551);
a = safe_add(a, olda);
b = safe_add(b, oldb);
c = safe_add(c, oldc);
d = safe_add(d, oldd);
}
return [a, b, c, d];
}
/*
* Convert an array of little-endian words to a string
*/
function binl2rstr(input) {
var i,
output = '';
for (i = 0; i < input.length * 32; i += 8) {
output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xFF);
}
return output;
}
/*
* Convert a raw string to an array of little-endian words
* Characters >255 have their high-byte silently ignored.
*/
function rstr2binl(input) {
var i,
output = [];
output[(input.length >> 2) - 1] = undefined;
for (i = 0; i < output.length; i += 1) {
output[i] = 0;
}
for (i = 0; i < input.length * 8; i += 8) {
output[i >> 5] |= (input.charCodeAt(i / 8) & 0xFF) << (i % 32);
}
return output;
}
/*
* Calculate the MD5 of a raw string
*/
function rstr_md5(s) {
return binl2rstr(binl_md5(rstr2binl(s), s.length * 8));
}
/*
* Calculate the HMAC-MD5, of a key and some data (raw strings)
*/
function rstr_hmac_md5(key, data) {
var i,
bkey = rstr2binl(key),
ipad = [],
opad = [],
hash;
ipad[15] = opad[15] = undefined;
if (bkey.length > 16) {
bkey = binl_md5(bkey, key.length * 8);
}
for (i = 0; i < 16; i += 1) {
ipad[i] = bkey[i] ^ 0x36363636;
opad[i] = bkey[i] ^ 0x5C5C5C5C;
}
hash = binl_md5(ipad.concat(rstr2binl(data)), 512 + data.length * 8);
return binl2rstr(binl_md5(opad.concat(hash), 512 + 128));
}
/*
* Convert a raw string to a hex string
*/
function rstr2hex(input) {
var hex_tab = '0123456789abcdef',
output = '',
x,
i;
for (i = 0; i < input.length; i += 1) {
x = input.charCodeAt(i);
output += hex_tab.charAt((x >>> 4) & 0x0F) +
hex_tab.charAt(x & 0x0F);
}
return output;
}
/*
* Encode a string as utf-8
*/
function str2rstr_utf8(input) {
return unescape(encodeURIComponent(input));
}
/*
* Take string arguments and return either raw or hex encoded strings
*/
function raw_md5(s) {
return rstr_md5(str2rstr_utf8(s));
}
function hex_md5(s) {
return rstr2hex(raw_md5(s));
}
function raw_hmac_md5(k, d) {
return rstr_hmac_md5(str2rstr_utf8(k), str2rstr_utf8(d));
}
function hex_hmac_md5(k, d) {
return rstr2hex(raw_hmac_md5(k, d));
}
$.md5 = function (string, key, raw) {
if (!key) {
if (!raw) {
return hex_md5(string);
} else {
return raw_md5(string);
}
}
if (!raw) {
return hex_hmac_md5(key, string);
} else {
return raw_hmac_md5(key, string);
}
};
}(typeof jQuery === 'function' ? jQuery : this));

View File

@ -22,7 +22,38 @@ $(document).ready(function() {
// Bootstrap iOS style switches for checkboxes with switch class
$('.switch').bootstrapSwitch();
if (document.getElementById("motd")) {
var md5motd = $.md5(document.getElementById('motd').innerHTML);
// Check if MOTD alert has been closed
//alert(md5motd);
if( $.cookie('motd-box') === md5motd ){
$('#motd').hide();
//alert('hidden');
}
}
if (document.getElementById("lastlogin")) {
var md5lastlogin = $.md5(document.getElementById('lastlogin').innerHTML);
// Check if lastlogin alert has been closed
//alert(md5lastlogin);
if( $.cookie('lastlogin-box') === md5lastlogin ){
$('#lastlogin').hide();
//alert('hidden');
}
}
if (document.getElementById("backend")) {
var md5backend = $.md5(document.getElementById('backend').innerHTML);
// Check if Backend Issues alert has been closed
//alert(md5backend);
if( $.cookie('backend-box') === md5backend ){
$('#backend').hide();
//alert('hidden');
}
}
});
$(function() {
@ -38,29 +69,19 @@ $(function() {
}, hide_delay + hide_next*index);
});
// Check if lastlogin alert has been closed
if( $.cookie('lastlogin-box') === 'closed' ){
$('#lastlogin').hide();
}
// Check if MOTD alert has been closed
if( $.cookie('motd-box') === 'closed' ){
$('#motd').hide();
}
// Check if Backend Issues alert has been closed
if( $.cookie('backend-box') === 'closed' ){
$('#backend').hide();
}
// Grab your button (based on your posted html)
$('.close').click(function( e ){
e.preventDefault();
//alert($(this).attr("id"));
if ($(this).attr("id") === 'motd') {
$.cookie('motd-box', 'closed', { path: '/' });
var md5motd = $.md5(document.getElementById('motd').innerHTML);
$.cookie('motd-box', md5motd, { path: '/' });
} else if ($(this).attr("id") === 'lastlogin') {
$.cookie('lastlogin-box', 'closed', { path: '/' });
var md5lastlogin = $.md5(document.getElementById('lastlogin').innerHTML);
$.cookie('lastlogin-box', md5lastlogin, { path: '/' });
} else if ($(this).attr("id") === 'backend') {
$.cookie('backend-box', 'closed', { path: '/' });
var md5backend = $.md5(document.getElementById('backend').innerHTML);
$.cookie('backend-box', md5backend, { path: '/' });
} else {
//alert($(this).attr("id"));
}

View File

@ -1,3 +1,10 @@
/**
* metisMenu v1.0.1
* Author : Osman Nuri Okumuş
* Copyright 2014
* Licensed under MIT
*/
;(function ($, window, document, undefined) {
var pluginName = "metisMenu",
@ -42,4 +49,4 @@
});
};
})(jQuery, window, document);
})(jQuery, window, document);

View File

@ -0,0 +1,15 @@
<div class="row">
<div class="col-lg-12">
<div class="panel panel-info">
<div class="panel-heading">
<i class="fa fa-comments-o fa-fw"></i> Moot Forum
</div>
<div class="panel-body">
<table class="table table-bordered">
<a class="moot" href="https://moot.it/i/{$CHATROOM|default:"lazypoolop"}">{$CHATROOM|default:"lazypoolop"}</a>
<script src="//cdn.moot.it/1/moot.min.js"></script>
</table>
</div>
</div>
</div>
</div>

View File

@ -0,0 +1 @@
0

View File

@ -18,7 +18,7 @@
<li><b><i>Q: What is a Orphan Block?</b></i></li>
&nbsp;<b>A:</b> Coins generated by a block will not be available to you right away. They will take some time to be confirmed by the entire network before you are allowed to transfer them out of the pool. Usually coins have a confirmation set to 120. What that actually means: the network (not the pool) has to discover 120 additional blocks on top of the one found by the pool to confirm it.
<br><br>
<li><b><i>Q: What is estimated paypout?</b></i></li>
<li><b><i>Q: What is estimated payout?</b></i></li>
&nbsp;<b>A:</b> Estimated Payout is your Estimated payout if a block is found at that time. This is an estimate according to your amount of shares submitted for the round(s).
<br><br>
<li><b><i>Q: What is Pool-variance?</b></i></li>

View File

@ -10,12 +10,13 @@
<div class="col-lg-12">
<div class="panel panel-info">
<div class="panel-heading">
<i class="fa fa-credit-card fa-fw"></i> All Time
<i class="fa fa-credit-card fa-fw"></i> Summary
</div>
<div class="panel-body">
<table class="table table-striped table-bordered table-hover">
<thead>
<tr>
<th class="col-xs-1"></th>
{foreach $SUMMARY as $type=>$total}
<th>{$type}</th>
{/foreach}
@ -23,6 +24,7 @@
</thead>
<tbody>
<tr>
<td class="col-xs-1">All Time</td>
{foreach $SUMMARY as $type=>$total}
<td class="right">{$total|number_format:"8"}</td>
{/foreach}
@ -44,7 +46,7 @@
<table class="table table-striped table-bordered table-hover">
<thead>
<tr>
<th></th>
<th class="col-xs-1"></th>
<th>Credit</th>
<th>Bonus</th>
<th>Debit AP</th>
@ -58,7 +60,7 @@
</thead>
<tbody>
<tr>
<td>Last Hour</th>
<td class="col-xs-1">Last Hour</th>
<td>{$BYTIME.1HourCredit|number_format:"8"}</td>
<td>{$BYTIME.1HourBonus|number_format:"8"}</td>
<td>{$BYTIME.1HourDebitAP|number_format:"8"}</td>
@ -70,7 +72,7 @@
<td>{$BYTIME.1HourTXFee|number_format:"8"}</td>
</tr>
<tr>
<td>Last Day</th>
<td class="col-xs-1">Last Day</th>
<td>{$BYTIME.24HourCredit|number_format:"8"}</td>
<td>{$BYTIME.24HourBonus|number_format:"8"}</td>
<td>{$BYTIME.24HourDebitAP|number_format:"8"}</td>
@ -82,7 +84,7 @@
<td>{$BYTIME.24HourTXFee|number_format:"8"}</td>
</tr>
<tr>
<td>Last Week</th>
<td class="col-xs-1">Last Week</th>
<td>{$BYTIME.1WeekCredit|number_format:"8"}</td>
<td>{$BYTIME.1WeekBonus|number_format:"8"}</td>
<td>{$BYTIME.1WeekDebitAP|number_format:"8"}</td>
@ -94,7 +96,7 @@
<td>{$BYTIME.1WeekTXFee|number_format:"8"}</td>
</tr>
<tr>
<td>Last Month</th>
<td class="col-xs-1">Last Month</th>
<td>{$BYTIME.1MonthCredit|number_format:"8"}</td>
<td>{$BYTIME.1MonthBonus|number_format:"8"}</td>
<td>{$BYTIME.1MonthDebitAP|number_format:"8"}</td>
@ -106,7 +108,7 @@
<td>{$BYTIME.1MonthTXFee|number_format:"8"}</td>
</tr>
<tr>
<td>Last Year</th>
<td class="col-xs-1">Last Year</th>
<td>{$BYTIME.1YearCredit|number_format:"8"}</td>
<td>{$BYTIME.1YearBonus|number_format:"8"}</td>
<td>{$BYTIME.1YearDebitAP|number_format:"8"}</td>
@ -123,7 +125,6 @@
</div>
</div>
</div>
</div>
</div>
</div>

View File

@ -28,7 +28,7 @@
{nocache}<input class="form-control" id="disabledInput" type="text" value="{$GLOBAL.userdata.coin_address|escape}" disabled />{/nocache}
</div>
<div class="form-group">
<label>4 digit PIN</label>
<label>4 Digit PIN</label>
<input class="form-control" type="password" name="authPin" size="4" maxlength="4" />
</div>
</div>

View File

@ -54,7 +54,7 @@
<font size="1">Hide username on website from others. Admins can still get your user information.</font>
</div>
<div class="form-group">
<label>4 digit PIN</label>
<label>4 Digit PIN</label>
<font size="1">The 4 digit PIN you chose when registering</font>
<input class="form-control" type="password" name="authPin" size="4" maxlength="4">
</div>

View File

@ -31,7 +31,7 @@
{nocache}<input class="form-control" type="password" name="newPassword2" id="pw_field2"{if $GLOBAL.twofactor.enabled && $GLOBAL.twofactor.options.changepw && !$CHANGEPASSUNLOCKED}id="disabledInput" disabled{/if}/>{/nocache}
</div>
<div class="form-group">
<label>4 digit PIN</label>
<label>4 Digit PIN</label>
<input class="form-control" type="password" name="authPin" size="4" maxlength="4" />
</div>

View File

@ -50,6 +50,17 @@
<input type="checkbox" class="switch" data-size="mini" name="data[success_login]" id="success_login" value="1"{nocache}{if $SETTINGS['success_login']|default:"0" == 1}checked{/if}{/nocache} />
</td>
</tr>
{if $DISABLE_POOLNEWSLETTER|default:"" != 1}
<tr>
<td>
<label>Pool Newsletter</label>
</td>
<td>
<input type="hidden" name="data[newsletter]" value="0" />
<input type="checkbox"class="switch" data-size="mini" name="data[newsletter]" id="new_block" value="1"{nocache}{if $SETTINGS['newsletter']|default:"1" == 1}checked{/if}{/nocache} />
</td>
</tr>
{/if}
</table>
</div>
<div class="panel-footer">
@ -97,4 +108,4 @@
</div>
</div>
</div>
</div>
</div>

View File

@ -1,5 +1,5 @@
<div class="row">
<form class="col-lg-4" role="form">
<form class="col-lg-3" role="form">
<input type="hidden" name="page" value="{$smarty.request.page|escape}">
<input type="hidden" name="action" value="{$smarty.request.action|escape}">
<input type="hidden" name="ctoken" value="{$CTOKEN|escape|default:""}" />
@ -31,14 +31,14 @@
</div>
</form>
<div class="col-lg-8">
<div class="col-lg-9">
<div class="panel panel-info">
<div class="panel-heading">
<i class="fa fa-clock-o fa-fw"></i> Transaction History
</div>
<div class="panel-body no-padding">
<div class="table-responsive">
<table class="table table-striped table-bordered table-hover">
<table class="table table-striped table-bordered table-condensed">
<thead>
<tr>
<th class="h6">ID</th>
@ -54,10 +54,10 @@
<tbody>
{section transaction $TRANSACTIONS}
<tr>
<td class="h6">{$TRANSACTIONS[transaction].id}</td>
<td class="h6">{$TRANSACTIONS[transaction].timestamp}</td>
<td class="h6">{$TRANSACTIONS[transaction].type}</td>
<td class="h6">
<td>{$TRANSACTIONS[transaction].id}</td>
<td>{$TRANSACTIONS[transaction].timestamp}</td>
<td>{$TRANSACTIONS[transaction].type}</td>
<td>
{if $TRANSACTIONS[transaction].type == 'Credit_PPS' OR
$TRANSACTIONS[transaction].type == 'Fee_PPS' OR
$TRANSACTIONS[transaction].type == 'Donation_PPS' OR
@ -73,14 +73,14 @@
<span class="label label-warning">Unconfirmed</span>
{/if}
</td>
<td class="h6"><a href="#" onClick="alert('{$TRANSACTIONS[transaction].coin_address|escape}')">{$TRANSACTIONS[transaction].coin_address|truncate:20:"...":true:true}</a></td>
<td><a href="#" onClick="alert('{$TRANSACTIONS[transaction].coin_address|escape}')">{$TRANSACTIONS[transaction].coin_address|truncate:20:"...":true:true}</a></td>
{if ! $GLOBAL.website.transactionexplorer.disabled}
<td class="h6"><a href="{$GLOBAL.website.transactionexplorer.url}{$TRANSACTIONS[transaction].txid|escape}" title="{$TRANSACTIONS[transaction].txid|escape}" target="_blank">{$TRANSACTIONS[transaction].txid|truncate:20:"...":true:true}</a></td>
<td><a href="{$GLOBAL.website.transactionexplorer.url}{$TRANSACTIONS[transaction].txid|escape}" title="{$TRANSACTIONS[transaction].txid|escape}" target="_blank">{$TRANSACTIONS[transaction].txid|truncate:20:"...":true:true}</a></td>
{else}
<td class="h6"><a href="#" onClick="alert('{$TRANSACTIONS[transaction].txid|escape}')" title="{$TRANSACTIONS[transaction].txid|escape}">{$TRANSACTIONS[transaction].txid|truncate:20:"...":true:true}</a></td>
<td><a href="#" onClick="alert('{$TRANSACTIONS[transaction].txid|escape}')" title="{$TRANSACTIONS[transaction].txid|escape}">{$TRANSACTIONS[transaction].txid|truncate:20:"...":true:true}</a></td>
{/if}
<td class="h6">{if $TRANSACTIONS[transaction].height == 0}n/a{else}<a href="{$smarty.server.SCRIPT_NAME}?page=statistics&action=round&height={$TRANSACTIONS[transaction].height}">{$TRANSACTIONS[transaction].height}</a>{/if}</td>
<td class="h6"><font color="{if $TRANSACTIONS[transaction].type == 'Credit' or $TRANSACTIONS[transaction].type == 'Credit_PPS' or $TRANSACTIONS[transaction].type == 'Bonus'}green{else}red{/if}">{$TRANSACTIONS[transaction].amount|number_format:"8"}</td>
<td>{if $TRANSACTIONS[transaction].height == 0}n/a{else}<a href="{$smarty.server.SCRIPT_NAME}?page=statistics&action=round&height={$TRANSACTIONS[transaction].height}">{$TRANSACTIONS[transaction].height}</a>{/if}</td>
<td><font color="{if $TRANSACTIONS[transaction].type == 'Credit' or $TRANSACTIONS[transaction].type == 'Credit_PPS' or $TRANSACTIONS[transaction].type == 'Bonus'}green{else}red{/if}">{$TRANSACTIONS[transaction].amount|number_format:"8"}</td>
</tr>
{/section}
</tbody>

View File

@ -42,7 +42,7 @@
<th class="smallwidth">Worker Login</th>
<th class="smallwidth">Worker Password</th>
<th class="text-center">Active</th>
{if $GLOBAL.config.disable_notifications != 1 && $DISABLE_IDLEWORKERNOTIFICATIONS != 1}<th>Monitor</th>{/if}
{if $GLOBAL.config.disable_notifications != 1 && $DISABLE_IDLEWORKERNOTIFICATIONS != 1}<th class="text-center">Monitor</th>{/if}
<th class="text-right">Khash/s</th>
<th class="text-right">Difficulty</th>
<th class="text-center">Action</th>
@ -62,7 +62,7 @@
<td><input class="form-control" type="text" name="data[{$WORKERS[worker].id}][password]" value="{$WORKERS[worker].password|escape}" size="10" required></td>
<td class="text-center"><i class="fa fa-{if $WORKERS[worker].hashrate > 0}check{else}times{/if} fa-fw"></i></td>
{if $GLOBAL.config.disable_notifications != 1 && $DISABLE_IDLEWORKERNOTIFICATIONS != 1}
<td>
<td class="text-center">
<input type="hidden" name="data[{$WORKERS[worker].id}][monitor]" value="0" />
<input type="checkbox" class="switch" data-size="mini" name="data[{$WORKERS[worker].id}][monitor]" id="data[{$WORKERS[worker].id}][monitor]" value="1" {if $WORKERS[worker].monitor}checked{/if}/>
</td>

View File

@ -31,8 +31,8 @@
</div>
<div class="panel-footer">
<ul class="pager">
<li class="previous {if $smarty.get.start|default:"0" <= 0}disabled{/if}">
<a href="{if $smarty.get.start|default:"0" <= 0}#{else}{$smarty.server.SCRIPT_NAME}?page={$smarty.request.page|escape}&action={$smarty.request.action|escape}&invitersstart={$smarty.request.invitersstart|escape|default:"0" - $LIMIT}{if $FILTERS|default:""}{$FILTERS}{/if}{/if}">&larr; Prev</a>
<li class="previous {if $smarty.get.invitersstart|default:"0" <= 0}disabled{/if}">
<a href="{if $smarty.get.invitersstart|default:"0" <= 0}#{else}{$smarty.server.SCRIPT_NAME}?page={$smarty.request.page|escape}&action={$smarty.request.action|escape}&invitersstart={$smarty.request.invitersstart|escape|default:"0" - $LIMIT}{if $FILTERS|default:""}{$FILTERS}{/if}{/if}">&larr; Prev</a>
</li>
<li class="next">
<a href="{$smarty.server.SCRIPT_NAME}?page={$smarty.request.page|escape}&action={$smarty.request.action|escape}&invitersstart={$smarty.request.invitersstart|escape|default:"0" + $LIMIT}{if $FILTERS|default:""}{$FILTERS}{/if}">Next &rarr;</a>

View File

@ -0,0 +1,37 @@
<script src="{$PATH}/js/cleditor/jquery.cleditor.min.js"></script>
<link rel="stylesheet" href="{$PATH}/js/cleditor/jquery.cleditor.css">
<script type="text/javascript">
$(document).ready(function () { $(".cleditor").cleditor(); });
</script>
<div class="row">
<form class="col-lg-12" method="POST" action="{$smarty.server.SCRIPT_NAME}" role="form">
<div class="panel panel-info">
<div class="panel-heading">
<i class="fa fa-edit fa-fw"></i> Write Newsletter
<br>
<font size="1px">Newsletters support the Markdown syntax</font>
</div>
<div class="panel-body">
<div class="row">
<div class="col-lg-12">
<input type="hidden" name="page" value="{$smarty.request.page|escape}">
<input type="hidden" name="action" value="{$smarty.request.action|escape}">
<input type="hidden" name="do" value="send">
<input type="hidden" name="ctoken" value="{$CTOKEN|escape|default:""}" />
<div class="form-group">
<label>Subject</label>
<input class="form-control" size="30" type="text" name="data[subject]" value="{$smarty.request.data.subject|default:""}" required />
</div>
<div class="form-group">
<label>Content</label>
<textarea class="form-control cleditor" name="data[content]" rows="5" required>{$smarty.request.data.content|default:""}</textarea>
</div>
</div>
</div>
</div>
<div class="panel-footer">
<input type="submit" value="Send" class="btn btn-success btn-sm">
</div>
</div>
</form>
</div>

View File

@ -3,7 +3,7 @@
<div class="col-lg-12">
<div class="panel panel-info">
<div class="panel-heading">
<i class="fa fa-user fa-fw"></i> Last registered Users
<i class="fa fa-user fa-fw"></i> Last Registered Users
</div>
<div class="panel-body no-padding">
<div class="table-responsive">
@ -15,7 +15,7 @@
<th>eMail</th>
<th>Reg. Date</th>
<th>Invite</th>
<th>Invited from</th>
<th>Invited From</th>
</tr>
</thead>
<tbody>
@ -25,7 +25,7 @@
<td>{$LASTREGISTEREDUSERS[user].mposuser}</td>
<td>{$LASTREGISTEREDUSERS[user].email}</td>
<td>{$LASTREGISTEREDUSERS[user].signup_timestamp|date_format:"%d/%m %H:%M:%S"}</td>
<td align="center">{if !$LASTREGISTEREDUSERS[user].inviter}<i class="fa fa-times fa-fw">{else}<i class="fa fa-check fa-fw">{/if}</td>
<td class="text-center">{if !$LASTREGISTEREDUSERS[user].inviter}<i class="fa fa-times fa-fw">{else}<i class="fa fa-check fa-fw">{/if}</td>
<td><a href="{$smarty.server.SCRIPT_NAME}?page=admin&action=user&do=query&filter[account]={$LASTREGISTEREDUSERS[user].inviter}">{$LASTREGISTEREDUSERS[user].inviter}</a></td>
</tr>
{/section}
@ -35,8 +35,8 @@
</div>
<div class="panel-footer">
<ul class="pager">
<li class="previous {if $smarty.get.start|default:"0" <= 0}disabled{/if}">
<a href="{if $smarty.get.start|default:"0" <= 0}#{else}{$smarty.server.SCRIPT_NAME}?page={$smarty.request.page|escape}&action={$smarty.request.action|escape}&registeredstart={$smarty.request.registeredstart|escape|default:"0" - $LIMIT}{if $FILTERS|default:""}{$FILTERS}{/if}{/if}">&larr; Prev</a>
<li class="previous {if $smarty.get.registeredstart|default:"0" <= 0}disabled{/if}">
<a href="{if $smarty.get.registeredstart|default:"0" <= 0}#{else}{$smarty.server.SCRIPT_NAME}?page={$smarty.request.page|escape}&action={$smarty.request.action|escape}&registeredstart={$smarty.request.registeredstart|escape|default:"0" - $LIMIT}{if $FILTERS|default:""}{$FILTERS}{/if}{/if}">&larr; Prev</a>
</li>
<li class="next">
<a href="{$smarty.server.SCRIPT_NAME}?page={$smarty.request.page|escape}&action={$smarty.request.action|escape}&registeredstart={$smarty.request.registeredstart|escape|default:"0" + $LIMIT}{if $FILTERS|default:""}{$FILTERS}{/if}#registrations">Next &rarr;</a>
@ -46,4 +46,4 @@
</div>
</div>
</div>
{/nocache}
{/nocache}

View File

@ -7,7 +7,7 @@
</div>
<div class="panel-body no-padding">
<div class="table-responsive">
<table class="table table-striped table-bordered table-hover">
<table class="table table-striped table-bordered table-condensed">
<thead>
<tr>
{foreach $SUMMARY as $type=>$total}
@ -31,7 +31,7 @@
{/if}
<div class="row">
<form class="col-lg-4" role="form">
<form class="col-lg-3" role="form">
<input type="hidden" name="page" value="{$smarty.request.page|escape}">
<input type="hidden" name="action" value="{$smarty.request.action|escape}">
<input type="hidden" name="ctoken" value="{$CTOKEN|escape|default:""}" />
@ -73,14 +73,14 @@
<div class="col-lg-8">
<div class="col-lg-9">
<div class="panel panel-info">
<div class="panel-heading">
<i class="fa fa-clock-o fa-fw"></i> Transaction History
</div>
<div class="panel-body no-padding">
<div class="table-responsive">
<table class="table table-striped table-bordered table-hover">
<table class="table table-striped table-bordered table-condensed">
<thead>
<tr>
<th class="h6">ID</th>
@ -97,11 +97,11 @@
<tbody>
{section transaction $TRANSACTIONS}
<tr>
<td class="h6">{$TRANSACTIONS[transaction].id}</td>
<td class="h6">{$TRANSACTIONS[transaction].username}</td>
<td class="h6">{$TRANSACTIONS[transaction].timestamp}</td>
<td class="h6">{$TRANSACTIONS[transaction].type}</td>
<td class="h6">
<td>{$TRANSACTIONS[transaction].id}</td>
<td>{$TRANSACTIONS[transaction].username}</td>
<td>{$TRANSACTIONS[transaction].timestamp}</td>
<td>{$TRANSACTIONS[transaction].type}</td>
<td>
{if $TRANSACTIONS[transaction].type == 'Credit_PPS' OR
$TRANSACTIONS[transaction].type == 'Fee_PPS' OR
$TRANSACTIONS[transaction].type == 'Donation_PPS' OR
@ -113,14 +113,14 @@
{else if $TRANSACTIONS[transaction].confirmations == -1}<span class="label label-danger">Orphaned</span>
{else}<span class="label label-warning">Unconfirmed</span>{/if}
</td>
<td class="h6"><a href="#" onClick="alert('{$TRANSACTIONS[transaction].coin_address|escape}')">{$TRANSACTIONS[transaction].coin_address|truncate:20:"...":true:true}</a></td>
<td><a href="#" onClick="alert('{$TRANSACTIONS[transaction].coin_address|escape}')">{$TRANSACTIONS[transaction].coin_address|truncate:20:"...":true:true}</a></td>
{if ! $GLOBAL.website.transactionexplorer.disabled}
<td class="h6"><a href="{$GLOBAL.website.transactionexplorer.url}{$TRANSACTIONS[transaction].txid|escape}" title="{$TRANSACTIONS[transaction].txid|escape}" target="_blank">{$TRANSACTIONS[transaction].txid|truncate:20:"...":true:true}</a></td>
<td><a href="{$GLOBAL.website.transactionexplorer.url}{$TRANSACTIONS[transaction].txid|escape}" title="{$TRANSACTIONS[transaction].txid|escape}" target="_blank">{$TRANSACTIONS[transaction].txid|truncate:20:"...":true:true}</a></td>
{else}
<td class="h6"><a href="#" onClick="alert('{$TRANSACTIONS[transaction].txid|escape}')" title="{$TRANSACTIONS[transaction].txid|escape}">{$TRANSACTIONS[transaction].txid|truncate:20:"...":true:true}</a></td>
<td><a href="#" onClick="alert('{$TRANSACTIONS[transaction].txid|escape}')" title="{$TRANSACTIONS[transaction].txid|escape}">{$TRANSACTIONS[transaction].txid|truncate:20:"...":true:true}</a></td>
{/if}
<td class="h6">{if $TRANSACTIONS[transaction].height == 0}n/a{else}<a href="{$smarty.server.SCRIPT_NAME}?page=statistics&action=round&height={$TRANSACTIONS[transaction].height}">{/if}{$TRANSACTIONS[transaction].height}</a></td>
<td class="h6"><font color="{if $TRANSACTIONS[transaction].type == 'Credit' or $TRANSACTIONS[transaction].type == 'Credit_PPS' or $TRANSACTIONS[transaction].type == 'Bonus'}green{else}red{/if}">{$TRANSACTIONS[transaction].amount|number_format:"8"}</td>
<td>{if $TRANSACTIONS[transaction].height == 0}n/a{else}<a href="{$smarty.server.SCRIPT_NAME}?page=statistics&action=round&height={$TRANSACTIONS[transaction].height}">{/if}{$TRANSACTIONS[transaction].height}</a></td>
<td><font color="{if $TRANSACTIONS[transaction].type == 'Credit' or $TRANSACTIONS[transaction].type == 'Credit_PPS' or $TRANSACTIONS[transaction].type == 'Bonus'}green{else}red{/if}">{$TRANSACTIONS[transaction].amount|number_format:"8"}</td>
</tr>
{/section}
</tbody>

View File

@ -88,7 +88,7 @@
<tr>
<th class="h6">ID</th>
<th class="h6">Username</th>
<th class="h6">E-Mail</th>
<th class="h6">eMail</th>
<th class="h6" style="padding-right:10px">Shares</th>
<th class="h6" style="padding-right:10px">Hashrate</th>
{if $GLOBAL.config.payout_system != 'pps'}
@ -109,31 +109,31 @@
{nocache}
{section name=user loop=$USERS|default}
<tr>
<td class="h6">{$USERS[user].id}</td>
<td class="h6">{$USERS[user].username|escape}</td>
<td class="h6">{$USERS[user].email|escape}</td>
<td class="h6">{$USERS[user].shares.valid}</td>
<td class="h6">{$USERS[user].hashrate}</td>
<td>{$USERS[user].id}</td>
<td>{$USERS[user].username|escape}</td>
<td>{$USERS[user].email|escape}</td>
<td>{$USERS[user].shares.valid}</td>
<td>{$USERS[user].hashrate}</td>
{if $GLOBAL.config.payout_system != 'pps'}
<td class="h6">{$USERS[user].estimates.donation|number_format:"8"}</td>
<td class="h6">{$USERS[user].estimates.payout|number_format:"8"}</td>
<td>{$USERS[user].estimates.donation|number_format:"8"}</td>
<td>{$USERS[user].estimates.payout|number_format:"8"}</td>
{else}
<td class="h6" colspan="2">{$USERS[user].estimates.hours24|number_format:"8"}</td>
<td colspan="2">{$USERS[user].estimates.hours24|number_format:"8"}</td>
{/if}
<td class="h6">{$USERS[user].balance|number_format:"8"}</td>
<td class="h6">{$USERS[user].signup_timestamp|date_format:"%d/%m %H:%M:%S"}</td>
<td class="h6">{$USERS[user].last_login|date_format:"%d/%m %H:%M:%S"}</td>
<td class="h6">
<td>{$USERS[user].balance|number_format:"8"}</td>
<td>{$USERS[user].signup_timestamp|date_format:"%d/%m %H:%M:%S"}</td>
<td>{$USERS[user].last_login|date_format:"%d/%m %H:%M:%S"}</td>
<td>
<input type="hidden" name="admin[{$USERS[user].id}]" value="0"/>
<input type="checkbox" onclick="storeAdmin({$USERS[user].id})" name="admin[{$USERS[user].id}]" value="1" id="admin[{$USERS[user].id}]" {if $USERS[user].is_admin}checked{/if} />
<label for="admin[{$USERS[user].id}]"></label>
</td>
<td class="h6">
<td>
<input type="hidden" name="locked[{$USERS[user].id}]" value="0"/>
<input type="checkbox" onclick="storeLock({$USERS[user].id})" name="locked[{$USERS[user].id}]" value="1" id="locked[{$USERS[user].id}]" {if $USERS[user].is_locked}checked{/if} />
<label for="locked[{$USERS[user].id}]"></label>
</td>
<td class="h6">
<td>
<input type="hidden" name="nofee[{$USERS[user].id}]" value="0"/>
<input type="checkbox" onclick="storeFee({$USERS[user].id})" name="nofee[{$USERS[user].id}]" value="1" id="nofee[{$USERS[user].id}]" {if $USERS[user].no_fees}checked{/if} />
<label for="nofee[{$USERS[user].id}]"></label>

View File

@ -83,7 +83,11 @@ $(document).ready(function(){
$('#b-poolworkers').html(number_format(data.getdashboarddata.data.pool.workers));
$('#b-hashrate').html((number_format(data.getdashboarddata.data.personal.hashrate, 2)));
$('#b-poolhashrate').html(number_format(data.getdashboarddata.data.pool.hashrate, 2));
$('#b-nethashrate').html(number_format(data.getdashboarddata.data.network.hashrate, 2));
if (data.getdashboarddata.data.network.hashrate > 0) {
$('#b-nethashrate').html(number_format(data.getdashboarddata.data.network.hashrate, 2));
} else {
$('#b-nethashrate').html('n/a');
}
$('#b-sharerate').html((parseFloat(data.getdashboarddata.data.personal.sharerate).toFixed(2)));
$('#b-yvalid').html(number_format(data.getdashboarddata.data.personal.shares.valid));
$('#b-yivalid').html(number_format(data.getdashboarddata.data.personal.shares.invalid));
@ -100,8 +104,13 @@ $(document).ready(function(){
$('#b-pefficiency').html(number_format(0, 2) + "%");
}
$('#b-diff').html(number_format(data.getdashboarddata.data.network.difficulty, 8));
$('#b-nextdiff').html(number_format(data.getdashboarddata.data.network.nextdifficulty, 8));
$('#b-nextdiffc').html(" Change in " + data.getdashboarddata.data.network.blocksuntildiffchange + " Blocks");
if (data.getdashboarddata.data.network.hashrate > 0) {
$('#b-nextdiff').html(number_format(data.getdashboarddata.data.network.nextdifficulty, 8));
$('#b-nextdiffc').html(" Change in " + data.getdashboarddata.data.network.blocksuntildiffchange + " Blocks");
} else {
$('#b-nextdiff').html('n/a');
$('#b-nextdiffc').html(' No Estimates');
}
var minutes = Math.floor(data.getdashboarddata.data.network.esttimeperblock / 60);
var seconds = Math.floor(data.getdashboarddata.data.network.esttimeperblock - minutes * 60);
$('#b-esttimeperblock').html(minutes + " minutes " + seconds + " seconds"); // <- this needs some nicer format

View File

@ -78,7 +78,7 @@
<div class="circle-tile-description text-faded">
<p class="h5 up-more">Net Hashrate</p>
<div class="circle-tile-number text-faded up">
<span class="overview" id="b-nethashrate">{$GLOBAL.nethashrate|number_format:"2"}</span>
<span class="overview" id="b-nethashrate">{if $GLOBAL.nethashrate > 0}{$GLOBAL.nethashrate|number_format:"2"}{else}n/a{/if}</span>
<span class="overview-mhs"> {$GLOBAL.hashunits.network}</span>
<br>
<span class="pool-nethashrate-bar spark-18"></span>

View File

@ -78,7 +78,7 @@
<div class="circle-tile-description text-faded">
<p class="h5 up-more">Net Hashrate</p>
<div class="circle-tile-number text-faded up">
<span class="overview" id="b-nethashrate">{$GLOBAL.nethashrate|number_format:"2"}</span>
<span class="overview" id="b-nethashrate">{if $GLOBAL.nethashrate > 0}{$GLOBAL.nethashrate|number_format:"2"}{else}n/a{/if}</span>
<span class="overview-mhs"> {$GLOBAL.hashunits.network}</span>
<br>
<span class="pool-nethashrate-bar spark-18"></span>

View File

@ -67,8 +67,8 @@
</div>
<div class="circle-tile-content lightblue">
<div class="circle-tile-description text-faded">
<p class="h5 up" id="b-nextdiff">{$NETWORK.EstNextDifficulty|number_format:"8"}</p>
<p class="h6" id="b-nextdiffc">Change in {$NETWORK.BlocksUntilDiffChange} Blocks</p>
<p class="h5 up" id="b-nextdiff">{if $GLOBAL.nethashrate > 0}{$NETWORK.EstNextDifficulty|number_format:"8"}{else}n/a{/if}</p>
<p class="h6" id="b-nextdiffc">{if $GLOBAL.nethashrate > 0}Change in {$NETWORK.BlocksUntilDiffChange} Blocks{else}No Estimates{/if}</p>
</div>
<div class="circle-tile-number text-faded">
<p class="h6 up-more2">Est Next Difficulty</p>

View File

@ -27,12 +27,12 @@
</div>
<div class="col-md-spark">
<i class="fa fa-th-large fa-2x"></i>
<p id="b-nblock" class="h5 font-bold m-t">{$GLOBAL.ppsvalue}</p>
<p id="b-ppsvalue" class="h5 font-bold m-t">{$GLOBAL.ppsvalue}</p>
<p class="h6 text-muted">PPS Value</p>
</div>
<div class="col-md-spark">
<i class="fa fa-bar-chart-o fa-flip-horizontal fa-2x"></i>
<p id="b-roundprogress" class="h6 font-bold m-t">{$GLOBAL.userdata.pps.unpaidshares}</p>
<p id="b-unpaidshares" class="h6 font-bold m-t">{$GLOBAL.userdata.pps.unpaidshares}</p>
<p class="h6 text-muted">Unpaid Shares</p>
</div>
<div class="col-md-spark">
@ -42,8 +42,8 @@
</div>
<div class="col-md-spark">
<i class="fa fa-sitemap fa-2x"></i>
<p id="b-nextdiff" class="h5 font-bold m-t">{$NETWORK.EstNextDifficulty|number_format:"8"}</p>
<p id="b-nextdiffc" class="h6 font-bold m-t">Change in {$NETWORK.BlocksUntilDiffChange} Blocks</p>
<p id="b-nextdiff" class="h5 font-bold m-t">{if $GLOBAL.nethashrate > 0}{$NETWORK.EstNextDifficulty|number_format:"8"}{else}n/a{/if}</p>
<p id="b-nextdiffc" class="h6 font-bold m-t">{if $GLOBAL.nethashrate > 0}Change in {$NETWORK.BlocksUntilDiffChange} Blocks{else}No Estimates{/if}</p>
<p class="h6 text-muted">Est Next Difficulty</p>
</div>
<div class="col-md-spark">

View File

@ -67,8 +67,8 @@
</div>
<div class="circle-tile-content lightblue">
<div class="circle-tile-description text-faded">
<p class="h5 up" id="b-nextdiff">{$NETWORK.EstNextDifficulty|number_format:"8"}</p>
<p class="h6" id="b-nextdiffc">Change in {$NETWORK.BlocksUntilDiffChange} Blocks</p>
<p class="h5 up" id="b-nextdiff">{if $GLOBAL.nethashrate > 0}{$NETWORK.EstNextDifficulty|number_format:"8"}{else}n/a{/if}</p>
<p class="h6" id="b-nextdiffc">{if $GLOBAL.nethashrate > 0}Change in {$NETWORK.BlocksUntilDiffChange} Blocks{else}No Estimates{/if}</p>
</div>
<div class="circle-tile-number text-faded">
<p class="h6">Est Next Difficulty</p>

View File

@ -14,11 +14,13 @@
</li>
<p>2. <strong>Download a miner.</strong></p>
<ul>
<li><em>Intel/ATI/AMD CGMiner 3.7.2 Scrypt Windows:</em> <a href="https://mega.co.nz/#!iQhlGIxa!mzKOfLY6TpOfvPvWE6JFlWdRgHEoshzm99f1hd3ZdRw" target="_blank">Download here</a></li>
<li><em>Intel/ATI/AMD CGMiner 3.7.2 Scrypt Linux:</em> <a href="http://ck.kolivas.org/apps/cgminer/3.7/cgminer-3.7.0.tar.bz2">Download Here</a></li>
<li><em>Intel/ATI/AMD BFGMiner Linux/Windows:</em> <a href="http://bfgminer.org" target="_blank">Download here</a></li>
<li><em>Fabulous Panda Miner Mac OS X:</em> <a href="http://fabulouspanda.co.uk/macminer/" target="_blank">Download here</a></li>
<li><em>MinerD CPU Miner Mac/Linux/Windows:</em><a href="https://bitcointalk.org/index.php?topic=55038.msg654850#msg654850" target="_blank"> Download here</a>.</li>
<li><em>Intel/ATI/AMD CGMiner Windows Sha256:</em> <a href="http://ck.kolivas.org/apps/cgminer/cgminer-4.2.2-windows.zip" target="_blank">Download here</a></li>
<li><em>Intel/ATI/AMD CGMiner Linux Sha256:</em> <a href="http://ck.kolivas.org/apps/cgminer/cgminer-4.2.2.tar.bz2" target="_blank">Download Here</a></li>
<li><em>Intel/ATI/AMD CGMiner 3.7.2 Scrypt Windows:</em> <a href="https://mega.co.nz/#!iQhlGIxa!mzKOfLY6TpOfvPvWE6JFlWdRgHEoshzm99f1hd3ZdRw" target="_blank">Download here</a></li>
<li><em>Intel/ATI/AMD CGMiner 3.7.2 Scrypt Linux:</em> <a href="http://ck.kolivas.org/apps/cgminer/3.7/cgminer-3.7.0.tar.bz2" target="_blank">Download Here</a></li>
<li><em>Intel/ATI/AMD BFGMiner Linux/Windows:</em> <a href="http://bfgminer.org" target="_blank">Download here</a></li>
<li><em>Fabulous Panda Miner Mac OS X:</em> <a href="http://fabulouspanda.co.uk/macminer/" target="_blank">Download here</a></li>
<li><em>Minerd CPU Miner Mac/Linux/Windows:</em><a href="https://bitcointalk.org/index.php?topic=55038.msg654850#msg654850" target="_blank"> Download here</a>.</li>
<li><em>NVIDIA Cudaminer:</em><a href="https://mega.co.nz/#!ZQxxRKJI!W_H00CQCBdQZUpgokQWmAsteplcbQfc-j44LrAvM9oQ" target="_blank"> Download here</a></li>
</ul>
</li>
@ -30,7 +32,7 @@
<li>BFGMiner</li>
<pre>./bfgminer {if $GLOBAL.config.algorithm == 'scrypt'}--scrypt{/if} -o stratum+tcp://{$SITESTRATUMURL|default:$smarty.server.SERVER_NAME}:{$SITESTRATUMPORT|default:"3333"} -u <em>Weblogin</em>.<em>WorkerName</em> -p <em>WorkerPassword</em></pre>
<br />
<p> If you want to mine on a <strong> Windows Operating System </strong>, Then you'll need to create a Batch File to start your miner. </p><p> You can download pre-configured one from MEGA <a href="https://mega.co.nz/#F!zdB3iDgS!MQfawuzu0FoEQ6sDEJSLnQ">Here</a> or you can make your own by opening notepad and then copy and pasting the following:</p>
<p> If you want to mine on a <strong> Windows Operating System </strong>, Then you'll need to create a Batch File to start your miner. </p><p> You can download pre-configured one from MEGA <a href="https://mega.co.nz/#F!zdB3iDgS!MQfawuzu0FoEQ6sDEJSLnQ" target="_blank">Here</a> or you can make your own by opening notepad and then copy and pasting the following:</p>
<li>MinerD</li>
<pre>minerd -a {if $GLOBAL.config.algorithm == 'scrypt'}--scrypt{/if} -t 6 -s 4 -o stratum+tcp://{$SITESTRATUMURL|default:$smarty.server.SERVER_NAME}:{$SITESTRATUMPORT|default:"3333"} -u <em>Weblogin</em>.<em>WorkerName</em> -p <em>WorkerPassword</em></pre>
<li>CGMiner</li>
@ -42,7 +44,7 @@
<br />
<p> You then need to change "-u Weblogin.Worker -p Worker password" to reflect your own account. Eg, "-u Steve.StevesWorker -p StevesWorkerPassword" Then go to "File => Save as" and save the file as "RunMe.bat" in the same folder as minerd. You are now ready to mine, double click on "RunMe.bat" to start mining. If you want, you can create additional workers with usernames and passwords of your choice <a href="{$smarty.server.SCRIPT_NAME}?page=account&action=workers">here</a></p>
</ul>
<p>4. <strong>Create a {$SITECOINNAME|default:"Litecoin"} address to recieve payments.</strong></p>
<p>4. <strong>Create a {$SITECOINNAME|default:"Litecoin"} address to receive payments.</strong></p>
<ul>
<li> Downloading the client &amp; block chain: Download the {$SITECOINNAME|default:"Litecoin"} client from <a href="{$SITECOINURL|default:"http://www.litecoin.org"}" target="_blank">here</a>.
<p>Generate a new address and input it on your account page to receive payments.</p>
@ -53,7 +55,7 @@
<ul>
<li><a href="https://raw.github.com/ckolivas/cgminer/v3.7.2/SCRYPT-README" target="_blank">Scrypt readme</a></li>
<li>Don't set <b>intensity</b> too high, I=11 is standard and safest. Higher intensity takes more GPU RAM. Check for <b>hardware errors</b> in cgminer (HW). HW=0 is good, otherwise lower intensity :)</li>
<li>Set shaders according to the readme (or look at your graphic cards specifications). Cgminer uses this value at first run to calculate <b>thread-concurrency</b>. Easiest way to get this optimized is to use same settings as others have used here: <a href="http://litecoin.info/Mining_Hardware_Comparison">here</a>.</li>
<li>Set shaders according to the readme (or look at your graphic cards specifications). Cgminer uses this value at first run to calculate <b>thread-concurrency</b>. Easiest way to get this optimized is to use same settings as others have used here: <a href="http://litecoin.info/Mining_Hardware_Comparison" target="_blank">here</a>.</li>
<li>There's also an interesting project which gives you a GUI for cgminer. Windows only it seems.</li>
<li>Here's a great <a href="https://docs.google.com/document/d/1Gw7YPYgMgNNU42skibULbJJUx_suP_CpjSEdSi8_z9U/preview?sle=true" target="_blank">guide</a> how to get up and running with Xubuntu.</li>
</ul>

View File

@ -18,7 +18,7 @@
<li><a href="{$smarty.server.SCRIPT_NAME}?page=account&action=earnings"><i class="fa fa-money fa-fw"></i> Earnings</a></li>
{if !$GLOBAL.config.disable_notifications}<li><a href="{$smarty.server.SCRIPT_NAME}?page=account&action=notifications"><i class="fa fa-bullhorn fa-fw"></i> Notifications</a></li>{/if}
{if !$GLOBAL.config.disable_invitations}<li><a href="{$smarty.server.SCRIPT_NAME}?page=account&action=invitations"><i class="fa fa-users fa-fw"></i> Invitations</a></li>{/if}
<li><a href="{$smarty.server.SCRIPT_NAME}?page=account&action=qrcode"><i class="fa fa-qrcode fa-fw"></i> QR Codes</a></li>
{if !$GLOBAL.acl.qrcode}<li><a href="{$smarty.server.SCRIPT_NAME}?page=account&action=qrcode"><i class="fa fa-qrcode fa-fw"></i> QR Codes</a></li>{/if}
</ul>
<!-- /.nav-second-level -->
</li>
@ -34,6 +34,7 @@
<li><a href="{$smarty.server.SCRIPT_NAME}?page=admin&action=transactions"><i class="fa fa-tasks fa-fw"></i> Transactions</a></li>
<li><a href="{$smarty.server.SCRIPT_NAME}?page=admin&action=settings"><i class="fa fa-gears fa-fw"></i> Settings</a></li>
<li><a href="{$smarty.server.SCRIPT_NAME}?page=admin&action=news"><i class="fa fa-list-alt fa-fw"></i> News</a></li>
<li><a href="{$smarty.server.SCRIPT_NAME}?page=admin&action=newsletter"><i class="fa fa-list-alt fa-fw"></i> Newsletter</a></li>
<li><a href="{$smarty.server.SCRIPT_NAME}?page=admin&action=reports"><i class="fa fa-list-ol fa-fw"></i> Reports</a></li>
<li><a href="{$smarty.server.SCRIPT_NAME}?page=admin&action=registrations"><i class="fa fa-pencil-square-o fa-fw"></i> Registrations</a></li>
<li><a href="{$smarty.server.SCRIPT_NAME}?page=admin&action=invitations"><i class="fa fa-users fa-fw"></i> Invitations</a></li>
@ -52,6 +53,7 @@
{acl_check page='statistics' action='blockfinder' name='<i class="fa fa-search fa-fw"></i> Blockfinder' acl=$GLOBAL.acl.blockfinder.statistics}
{acl_check page='statistics' action='uptime' name='<i class="fa fa-clock-o fa-fw"></i> Uptime' acl=$GLOBAL.acl.uptime.statistics}
{acl_check page='statistics' action='graphs' name='<i class="fa fa-signal fa-fw"></i> Graphs' acl=$GLOBAL.acl.graphs.statistics}
{acl_check page='statistics' action='donors' name='<i class="fa fa-bitbucket fa-fw"></i> Donors' acl=$GLOBAL.acl.donors.page}
</ul>
<!-- /.nav-second-level -->
</li>
@ -60,8 +62,8 @@
<ul class="nav nav-second-level">
<li><a href="{$smarty.server.SCRIPT_NAME}?page=gettingstarted"><i class="fa fa-question fa-fw"></i> Getting Started</a></li>
{acl_check page='about' action='pool' name='<i class="fa fa-info fa-fw"></i> About' acl=$GLOBAL.acl.about.page}
{acl_check page='about' action='donors' name='<i class="fa fa-bitbucket fa-fw"></i> Donors' acl=$GLOBAL.acl.donors.page}
{acl_check page='about' action='chat' name='<i class="fa fa-comments-o fa-fw"></i> Web Chat' acl=$GLOBAL.acl.chat.page}
{acl_check page='about' action='moot' name='<i class="fa fa-ticket fa-fw"></i> Forum' acl=$GLOBAL.acl.moot.forum}
</ul>
<!-- /.nav-second-level -->
</li>

View File

@ -28,6 +28,7 @@
<script src="{$PATH}/js/jquery-2.0.3.min.js"></script>
<script src="{$PATH}/js/jquery.cookie.js"></script>
<script src="{$PATH}/js/jquery.md5.js"></script>
<script src="{$PATH}/js/bootstrap.min.js"></script>
<script src="{$PATH}/js/bootstrap-switch.min.js"></script>
<script src="{$PATH}/js/plugins/dataTables/jquery.dataTables.js"></script>

View File

@ -10,21 +10,21 @@
<thead>
<tr>
<th></th>
<th class="text-right">Gen est.</th>
<th class="text-right">Gen. Est.</th>
<th class="text-right">Found</th>
<th class="text-right">Valid</th>
<th class="text-right">Orphan</th>
<th class="text-right">Avg Diff</th>
<th class="text-right">Shares est.</th>
<th class="text-right">Avg. Diff</th>
<th class="text-right">Shares Est.</th>
<th class="text-right">Shares</th>
<th class="text-right">Percentage</th>
<th class="text-right">Amount</th>
<th class="text-right">Rate est.</th>
<th class="text-right">Rate Est.</th>
</tr>
</thead>
<tbody>
<tr>
<th style="padding-left: 15px">all time</th>
<th>All Time</th>
<td class="text-right">{($FIRSTBLOCKFOUND / $COINGENTIME)|number_format}</td>
<td class="text-right">{$LASTBLOCKSBYTIME.Total|number_format}</td>
<td class="text-right">{$LASTBLOCKSBYTIME.TotalValid|number_format}</td>
@ -45,11 +45,11 @@
0.00%
{/if}
</td>
<td class="text-right">{$LASTBLOCKSBYTIME.TotalAmount|number_format}</td>
<td class="text-right">{$LASTBLOCKSBYTIME.TotalAmount|number_format:"2"}</td>
<td class="text-right">{($LASTBLOCKSBYTIME.Total|default:"0.00" / ($FIRSTBLOCKFOUND / $COINGENTIME) * 100)|number_format:"2"}%</td>
</tr>
<tr>
<th style="padding-left: 15px">last hour</th>
<th>Last Hour</th>
<td class="text-right">{(3600 / $COINGENTIME)|number_format}</td>
<td class="text-right">{$LASTBLOCKSBYTIME.1HourTotal|number_format}</td>
<td class="text-right">{$LASTBLOCKSBYTIME.1HourValid|number_format}</td>
@ -70,11 +70,11 @@
0.00%
{/if}
</td>
<td class="text-right">{$LASTBLOCKSBYTIME.1HourAmount|number_format}</td>
<td class="text-right">{$LASTBLOCKSBYTIME.1HourAmount|number_format:"2"}</td>
<td class="text-right">{($LASTBLOCKSBYTIME.1HourTotal|default:"0.00" / (3600 / $COINGENTIME) * 100)|number_format:"2"}%</td>
</tr>
<tr>
<th style="padding-left: 15px">last 24 hours</th>
<th style="padding-left:3px;padding-right:1px;">Last 24 Hours</th>
<td class="text-right">{(86400 / $COINGENTIME)|number_format}</td>
<td class="text-right">{$LASTBLOCKSBYTIME.24HourTotal|number_format}</td>
<td class="text-right">{$LASTBLOCKSBYTIME.24HourValid|number_format}</td>
@ -95,11 +95,11 @@
0.00%
{/if}
</td>
<td class="text-right">{$LASTBLOCKSBYTIME.24HourAmount|number_format}</td>
<td class="text-right">{$LASTBLOCKSBYTIME.24HourAmount|number_format:"2"}</td>
<td class="text-right">{($LASTBLOCKSBYTIME.24HourTotal|default:"0.00" / (86400 / $COINGENTIME) * 100)|number_format:"2"}%</td>
</tr>
<tr>
<th style="padding-left: 15px">last 7 days</th>
<th>Last 7 Days</th>
<td class="text-right">{(604800 / $COINGENTIME)|number_format}</td>
<td class="text-right">{$LASTBLOCKSBYTIME.7DaysTotal|number_format}</td>
<td class="text-right">{$LASTBLOCKSBYTIME.7DaysValid|number_format}</td>
@ -120,11 +120,11 @@
0.00%
{/if}
</td>
<td class="text-right">{$LASTBLOCKSBYTIME.7DaysAmount}</td>
<td class="text-right">{$LASTBLOCKSBYTIME.7DaysAmount|number_format:"2"}</td>
<td class="text-right">{($LASTBLOCKSBYTIME.7DaysTotal|default:"0.00" / (604800 / $COINGENTIME) * 100)|number_format:"2"}%</td>
</tr>
<tr>
<th style="padding-left: 15px">last 4 Weeks</th>
<th>Last 4 Weeks</th>
<td class="text-right">{(2419200 / $COINGENTIME)|number_format}</td>
<td class="text-right">{$LASTBLOCKSBYTIME.4WeeksTotal|number_format}</td>
<td class="text-right">{$LASTBLOCKSBYTIME.4WeeksValid|number_format}</td>
@ -145,11 +145,11 @@
0.00%
{/if}
</td>
<td class="text-right">{$LASTBLOCKSBYTIME.4WeeksAmount|number_format}</td>
<td class="text-right">{$LASTBLOCKSBYTIME.4WeeksAmount|number_format:"2"}</td>
<td class="text-right">{($LASTBLOCKSBYTIME.4WeeksTotal|default:"0.00" / (2419200 / $COINGENTIME) * 100)|number_format:"2"}%</td>
</tr>
<tr>
<th style="padding-left: 15px">last 12 Month</th>
<th>The Past 12 Months</th>
<td class="text-right">{(29030400 / $COINGENTIME)|number_format}</td>
<td class="text-right">{$LASTBLOCKSBYTIME.12MonthTotal|number_format}</td>
<td class="text-right">{$LASTBLOCKSBYTIME.12MonthValid|number_format}</td>
@ -170,7 +170,7 @@
0.00%
{/if}
</td>
<td class="text-right">{$LASTBLOCKSBYTIME.12MonthAmount|number_format}</td>
<td class="text-right">{$LASTBLOCKSBYTIME.12MonthAmount|number_format:"2"}</td>
<td class="text-right">{($LASTBLOCKSBYTIME.12MonthTotal|default:"0.00" / (29030400 / $COINGENTIME) * 100)|number_format:"2"}%</td>
</tr>
</tbody>
@ -178,7 +178,7 @@
</div>
</div>
<div class="panel-footer">
<h6>{if $GLOBAL.config.payout_system != 'pps'}Round earnings are not credited until <font color="orange">{$GLOBAL.confirmations}</font> confirms.{/if}</h6>
<h6>{if $GLOBAL.config.payout_system != 'pps'}Round earnings are not credited until <font class="confirmations">{$GLOBAL.confirmations}</font> confirms.{/if}</h6>
</div>
</div>
</div>

View File

@ -9,7 +9,7 @@
<table class="table table-striped table-bordered table-hover">
<thead>
<tr>
<th class="text-right">Block</th>
<th class="text-center">Block</th>
<th class="text-center">Validity</th>
<th class="text-left">Finder</th>
<th class="text-right">Time</th>
@ -32,7 +32,7 @@
{assign var="count" value=$count+1}
{if $GLOBAL.config.payout_system == 'pplns'}{assign var="pplnsshares" value=$pplnsshares+$BLOCKSFOUND[block].pplns_shares}{/if}
{if ! $GLOBAL.website.blockexplorer.disabled}
<td class="text-right"><a href="{$smarty.server.SCRIPT_NAME}?page=statistics&action=round&height={$BLOCKSFOUND[block].height}">{$BLOCKSFOUND[block].height}</a></td>
<td class="text-center"><a href="{$smarty.server.SCRIPT_NAME}?page=statistics&action=round&height={$BLOCKSFOUND[block].height}">{$BLOCKSFOUND[block].height}</a></td>
{else}
<td class="text-right">{$BLOCKSFOUND[block].height}</td>
{/if}
@ -46,7 +46,7 @@
{/if}
</td>
<td>{if $BLOCKSFOUND[block].is_anonymous|default:"0" == 1 && $GLOBAL.userdata.is_admin|default:"0" == 0}anonymous{else}{$BLOCKSFOUND[block].finder|default:"unknown"|escape}{/if}</td>
<td class="text-right">{$BLOCKSFOUND[block].time|date_format:"%d/%m %H:%M:%S"}</td>
<td class="text-right">{$BLOCKSFOUND[block].time|date_format:"%d/%m/%Y %H:%M:%S"}</td>
<td class="text-right">{$BLOCKSFOUND[block].difficulty|number_format:"4"}</td>
<td class="text-right">{$BLOCKSFOUND[block].amount|number_format:"2"}</td>
<td class="text-right">
@ -77,7 +77,7 @@
</div>
</div>
<div class="panel-footer">
<h6>{if $GLOBAL.config.payout_system != 'pps'}Round Earnings are not credited until <font color="orange">{$GLOBAL.confirmations}</font> confirms.{/if}</h6>
<h6>{if $GLOBAL.config.payout_system != 'pps'}Round Earnings are not credited until <font class="confirmations">{$GLOBAL.confirmations}</font> confirms.{/if}</h6>
</div>
</div>
</div>

View File

@ -32,7 +32,7 @@
</div>
{if $GLOBAL.config.payout_system != 'pps'}
<div class="panel-footer">
<h6>Note: Round Earnings are not credited until <font color="orange">{$GLOBAL.confirmations}</font> confirms.</h6>
<h6>Note: Round Earnings are not credited until <font class="confirmations">{$GLOBAL.confirmations}</font> confirms.</h6>
</div>
{/if}
</div>

View File

@ -35,7 +35,7 @@
{/section}
{if $listed != 1 && $GLOBAL.userdata.username|default:"" && $GLOBAL.userdata.rawhashrate|default:"0" > 0}
{math assign="myestday" equation="round(reward / ( diff * pow(2,32) / ( hashrate * 1000 ) / 3600 / 24), 3)" diff=$DIFFICULTY reward=$REWARD hashrate=$GLOBAL.userdata.rawhashrate}
{if $GLOBAL.userdata.username|default:""|lower == $CONTRIBHASHES[contrib].account|lower}{assign var=listed value=1}<tr class="success">{else}</tr>{/if}>
{if $GLOBAL.userdata.username|default:""|lower == $CONTRIBHASHES[contrib].account|lower}{assign var=listed value=1}<tr class="success">{else}<tr>{/if}
<td>n/a</td>
<td>{if $GLOBAL.userdata.donate_percent|default:"0" >= 2}<i class="fa fa-trophy fa-fw"></i>{elseif $GLOBAL.userdata.donate_percent|default:"0" < 2 AND $GLOBAL.userdata.donate_percent|default:"0" > 0}<i class="fa fa-star-o fa-fw"></i>{else}<i class="fa fa-ban fa-fw"></i>{/if}</td>
<td>{$GLOBAL.userdata.username|escape}</td>

View File

@ -25,7 +25,7 @@
</tr>
{/section}
{if $listed != 1 && $GLOBAL.userdata.username|default:"" && $GLOBAL.userdata.shares.valid|default:"0" > 0}
{if $GLOBAL.userdata.username|default:""|lower == $CONTRIBHASHES[contrib].account|lower}{assign var=listed value=1}<tr class="success">{else}</tr>{/if}>
{if $GLOBAL.userdata.username|default:""|lower == $CONTRIBHASHES[contrib].account|lower}{assign var=listed value=1}<tr class="success">{else}<tr>{/if}
<td>n/a</td>
<td>{if $GLOBAL.userdata.donate_percent|default:"0" >= 2}<i class="fa fa-trophy fa-fw"></i>{elseif $GLOBAL.userdata.donate_percent|default:"0" < 2 AND $GLOBAL.userdata.donate_percent|default:"0" > 0}<i class="fa fa-star-o fa-fw"></i>{else}<i class="fa fa-ban fa-fw"></i>{/if}</td>
<td>{$GLOBAL.userdata.username|escape}</td>

View File

@ -6,5 +6,5 @@
<li>The Pool is not an e-wallet or a bank for your coins. The Pool and it's operators are not responsible for any loss of coins which are stored on the Pool. It is your responsibility to configure your account so that the coins you mine are regularly transferred to your own secured offline wallet.</li>
<li>The uptime of the pool or website is not guaranteed, maintenance and downtime may be required at times. Users are responsible for configuring their miners so that they will automatically reconnect, switch to all the pools we offer or a backup pool in the case of downtime.</li>
<li>Botnets are not welcome. Accounts with a large amount of miners connecting from different IPs may be suspended without prior notice. If we are uncertian then an investigation will be opened and the user will be notified via their configured e-mail address. If we do not receive a response your account may be suspended.</li>
<li>Multiple accounts controlled by one person may be considered as a botnet and a investigation will be opened, see 6.</li>
<li>Multiple accounts controlled by one person may be considered as a botnet and an investigation will be opened, see above point.</li>
</ul>

View File

@ -0,0 +1,9 @@
<html>
<body>
<p>Dear {nocache}{$DATA.username}{/nocache},</p>
<div>
{$DATA.CONTENT}
</div>
<p></p>
</body>
</html>

View File

@ -18,7 +18,7 @@ Below is a standard FAQ.
<li><b><i>Q: What is a Orphan Block?</b></i></li>
&nbsp;A: Coins generated by a block will not be available to you right away. They will take some time to be confirmed by the entire network before you are allowed to transfer them out of the pool. Usually coins have a confirmation set to 120. What that actually means: the network (not the pool) has to discover 120 additional blocks on top of the one found by the pool to confirm it.</li>
<br><br>
<li><b><i>Q: What is estimated paypout?</b></i></li>
<li><b><i>Q: What is estimated payout?</b></i></li>
&nbsp;A: Estimated Payout is your Estimated payout if a block is found at that time. This is an estimate according to your amount of shares submitted for the round(s).</a></li>
<br><br>
<li><b><i>Q: What is Pool-variance?</b></i></li>