function dopplns($data, $user) { global $send_sep; $pg = '<h1>CKPool</h1>'; $blk = getparam('blk', true); if (nuem($blk)) { $tx = ''; # so can make a link $blkuse = getparam('blkuse', true); if (nuem($blkuse)) { $blkuse = ''; } else { $tx = 'y'; } $pg = '<br>' . makeForm('pplns') . "\nBlock: <input type=text name=blk size=10 value='{$blkuse}'>\n Tx: <input type=text name=tx size=1 value='{$tx}'>\n Dust (Satoshi): <input type=text name=dust size=5 value='10000'>\n Fee (BTC): <input type=text name=fee size=5 value='0.0'>\n <input type=submit name=Calc value=Calc>\n</form>"; } else { $tx = getparam('tx', true); if (nuem($tx) || substr($tx, 0, 1) != 'y') { $dotx = false; } else { $dotx = true; } $flds = array('height' => $blk, 'allow_aged' => 'Y'); if ($blk > 334106) { $flds['diff_times'] = '5'; } $msg = msgEncode('pplns', 'pplns', $flds, $user); $rep = sendsockreply('pplns', $msg, 4); if ($rep == false) { $ans = array(); } else { $ans = repDecode($rep); } if ($ans['ERROR'] != null) { return '<font color=red size=+1><br>' . $ans['STATUS'] . ': ' . $ans['ERROR'] . '</font>'; } if (!isset($ans['pplns_last'])) { return '<font color=red size=+1><br>Partial data returned</font>'; } $reward_sat = $ans['block_reward']; $miner_sat = round($reward_sat * 0.991); $ans['miner_sat'] = $miner_sat; $data = array('Block' => 'block', 'Block Status' => 'block_status', 'Block Hash' => 'block_hash', 'Block Reward (Satoshis)' => 'block_reward', 'Miner Reward (Satoshis)' => 'miner_sat', 'PPLNS Wanted' => '.diff_want', 'PPLNS Used' => '.diffacc_total', 'Elapsed Seconds' => ',pplns_elapsed', 'Users' => 'rows', 'Oldest Workinfoid' => 'begin_workinfoid', 'Oldest Time' => 'begin_stamp', 'Oldest Epoch' => 'begin_epoch', 'Block Workinfoid' => 'block_workinfoid', 'Block Time' => 'block_stamp', 'Block Epoch' => 'block_epoch', 'Newest Workinfoid' => 'end_workinfoid', 'Newest Share Time' => 'end_stamp', 'Newest Share Epoch' => 'end_epoch', 'Network Difficulty' => 'block_ndiff', 'PPLNS Factor' => 'diff_times', 'PPLNS Added' => 'diff_add', 'Accepted Share Count' => ',acc_share_count', 'Total Share Count' => ',total_share_count', 'ShareSummary Count' => ',ss_count', 'WorkMarkers Count' => ',wm_count', 'MarkerSummary Count' => ',ms_count'); $pg = '<br><a href=https://blockchain.info/block-height/'; $pg .= $ans['block'] . '>Blockchain ' . $ans['block'] . "</a><br>\n"; if (strlen($ans['marks_status']) > 0) { $pg .= '<br><span class=err>'; $msg = $ans['marks_status']; $pg .= str_replace(' ', ' ', $msg) . "</span><br>\n"; } if (strlen($ans['block_extra']) > 0) { $pg .= '<br><span class=err>'; $msg = $ans['block_status'] . ' - ' . $ans['block_extra']; $pg .= str_replace(' ', ' ', $msg) . "</span><br>\n"; } if (strlen($ans['share_status']) > 0) { $pg .= '<br><span class=err>'; $msg = $ans['share_status'] . " - Can't be paid out yet"; $pg .= str_replace(' ', ' ', $msg) . "</span><br>\n"; } $pg .= "<br><table cellpadding=0 cellspacing=0 border=0>\n"; $pg .= '<tr class=title>'; $pg .= '<td class=dl>Name</td>'; $pg .= '<td class=dr>Value</td>'; $pg .= "</tr>\n"; $i = 0; foreach ($data as $dsp => $name) { if ($i++ % 2 == 0) { $row = 'even'; } else { $row = 'odd'; } $pg .= "<tr class={$row}>"; $pg .= "<td class=dl>{$dsp}</td>"; switch ($name[0]) { case ',': case '.': $nm = substr($name, 1); $fmt = fmtdata($name[0], $ans[$nm]); break; default: $fmt = $ans[$name]; break; } $pg .= "<td class=dr>{$fmt}</td>"; $pg .= "</tr>\n"; } $pg .= "</table><br><table cellpadding=0 cellspacing=0 border=0>\n"; $pg .= '<tr class=title>'; $pg .= '<td class=dl>User</td>'; $pg .= '<td class=dr>Diff Accepted</td>'; $pg .= '<td class=dr>%</td>'; $pg .= '<td class=dr>Avg Hashrate</td>'; $pg .= '<td class=dr>BTC -0.9%</td>'; $pg .= '<td class=dr>Address</td>'; $pg .= "</tr>\n"; $diffacc_total = $ans['diffacc_total']; if ($diffacc_total == 0) { $diffacc_total = pow(10, 15); } $elapsed = $ans['pplns_elapsed']; $count = $ans['rows']; $tot_pay = 0; for ($i = 0; $i < $count; $i++) { $diffacc_user = $ans['diffacc_user:'******'%'; $avg_hash = number_format($diffacc_user / $elapsed * pow(2, 32), 0); $pay_sat = floor($miner_sat * $diffacc_user / $diffacc_total); $payaddress = $ans['payaddress:' . $i]; if ($i % 2 == 0) { $row = 'even'; } else { $row = 'odd'; } $pg .= "<tr class={$row}>"; $pg .= '<td class=dl>' . $ans['user:'******'</td>'; $pg .= "<td class=dr>{$diffacc_user}</td>"; $pg .= "<td class=dr>{$diffacc_percent}</td>"; $pg .= "<td class=dr>{$avg_hash}</td>"; $pg .= '<td class=dr>' . btcfmt($pay_sat) . '</td>'; $pg .= "<td class=dr>{$payaddress}</td>"; $pg .= "</tr>\n"; $tot_pay += $pay_sat; } if ($i % 2 == 0) { $row = 'even'; } else { $row = 'odd'; } $pg .= "<tr class={$row}>"; $pg .= '<td class=dl colspan=3></td>'; $pg .= '<td class=dr></td>'; $pg .= '<td class=dr>' . btcfmt($tot_pay) . '</td>'; $pg .= '<td class=dr></td>'; $pg .= "</tr>\n"; $pg .= "</table>\n"; if ($dotx === true) { $pg .= calctx($ans, $count, $miner_sat, $diffacc_total); } } return $pg; }
function dompayouts($data, $user) { $pg = '<h1>Mining Rewards</h1>'; $ans = getMPayouts($user); $pg .= "The rewards you've earned for each block the pool has found.<br>"; $pg .= 'See the '; $pg .= makeLink('payments'); $pg .= "Payments</a> page for the payments you've been sent.<br><br>"; $pg .= "<table callpadding=0 cellspacing=0 border=0>\n"; $pg .= "<tr class=title>"; $pg .= "<td class=dr>Block</td>"; $pg .= "<td class=dr>Block UTC</td>"; $pg .= "<td class=dr>Miner Reward</td>"; $pg .= "<td class=dr>N Diff</td>"; $pg .= "<td class=dr>N Range</td>"; $pg .= "<td class=dr>Pool N Avg</td>"; $pg .= "<td class=dr>Your %</td>"; $pg .= "<td class=dr>Your N Diff</td>"; $pg .= "<td class=dr>Your N Avg</td>"; $pg .= "<td class=dr>Your BTC</td>"; $pg .= "</tr>\n"; if ($ans['STATUS'] == 'ok') { $totamt = 0; $count = $ans['rows']; for ($i = 0; $i < $count; $i++) { if ($i % 2 == 0) { $row = 'even'; } else { $row = 'odd'; } $pg .= "<tr class={$row}>"; $pg .= '<td class=dr>' . $ans['height:' . $i] . '</td>'; $pg .= '<td class=dr>' . gmdate('j/M H:i', $ans['blockcreatedate:' . $i]) . '</td>'; $pg .= '<td class=dr>' . btcfmt($ans['minerreward:' . $i]) . '</td>'; $diffused = $ans['diffused:' . $i]; $pg .= '<td class=dr>' . difffmt($diffused) . '</td>'; $elapsed = $ans['elapsed:' . $i]; $pg .= '<td class=dr>' . howmanyhrs($elapsed) . '</td>'; $phr = $diffused * pow(2, 32) / $elapsed; $pg .= '<td class=dr>' . siprefmt($phr) . 'Hs</td>'; $diffacc = $ans['diffacc:' . $i]; $ypct = $diffacc * 100 / $diffused; $pg .= '<td class=dr>' . number_format($ypct, 2) . '%</td>'; $pg .= '<td class=dr>' . difffmt($diffacc) . '</td>'; $hr = $diffacc * pow(2, 32) / $elapsed; $pg .= '<td class=dr>' . dsprate($hr) . '</td>'; $amount = $ans['amount:' . $i]; $totamt += $amount; $pg .= '<td class=dr>' . btcfmt($amount) . '</td>'; $pg .= "</tr>\n"; } if ($count > 1) { if ($i % 2 == 0) { $row = 'even'; } else { $row = 'odd'; } $pg .= "<tr class={$row}>"; $pg .= '<td class=dr>Total:</td>'; $pg .= '<td class=dl colspan=8></td>'; $pg .= '<td class=dr>' . btcfmt($totamt) . '</td>'; $pg .= "</tr>\n"; } } $pg .= "</table>\n"; return $pg; }
function doworker($data, $user) { $title = ''; $pg = worktable(); $totshare = 0; $totdiff = 0; $totshrate = 0; $totinvalid = 0; $totrate = 0; $offset = 0; $blockacc = 0; $blockreward = 0; $instances = 0; $pg .= worktitle($data, $user); $pg .= workuser($data, $user, $offset, $totshare, $totdiff, $totshrate, $totinvalid, $totrate, $blockacc, $blockreward, false, true, true, $title, $instances); $pg .= worktotal($offset, $totshare, $totdiff, $totshrate, $totinvalid, $totrate, $blockacc, $blockreward, $instances); if (false && $blockacc > 0 && $blockreward > 0) { $btc = btcfmt($totdiff / $blockacc * $blockreward); $pg .= '<tr><td colspan=8 class=dc>'; $pg .= "<br>Payout est if block found at 100%: ~{$btc} BTC"; $pg .= '</td></tr>'; } $pg .= "</table>\n"; $pg .= "<script type='text/javascript'>\n"; $pg .= "sotc('worksrt','srtrate');</script>\n"; return "<h1>Workers{$title}</h1>" . $pg; }
function dopayments($data, $user) { $btc = 'https://www.blocktrail.com/BTC/address/'; $btcn = 'blocktrail'; $addr1 = '1KzFJddTvK9TQWsmWFKYJ9fRx9QeSATyrT'; $addr2 = '16dRhawxuR3BmdmkzdzUdgEfGAQszgmtbc'; $addr3 = '1N6LrEDiHuFwSyJYj2GedZM2FGk7kkLjn'; $addr4 = '1CVVn6sC46aZdokEnU1LThmi8WsMV4qzgh'; $addr5 = '13pucx6gHP2vyBLc88QfcGivjkhK63PeVg'; $pg = '<h1>Payments</h1>'; $pg .= "The payment transactions on {$btcn} are here:"; $pg .= " <a href='{$btc}{$addr1}' target=_blank>BTCa</a>,"; $pg .= " <a href='{$btc}{$addr2}' target=_blank>BTCb</a>,"; $pg .= " <a href='{$btc}{$addr3}' target=_blank>BTCc</a>,"; $pg .= " <a href='{$btc}{$addr4}' target=_blank>BTCd</a> and"; $pg .= " <a href='{$btc}{$addr5}' target=_blank>BTCe</a><br>"; $pg .= "The payments below don't yet show when they have been sent.<br>"; $pg .= "Dust payments below 0.00010000 BTC are not sent out yet.<br><br>"; $ans = getPayments($user); $pg .= "<table cellpadding=0 cellspacing=0 border=0>\n"; $pg .= '<thead><tr class=title>'; $pg .= '<td class=dl>Block</td>'; $pg .= '<td class=dl>Address</td>'; $pg .= '<td class=dl>Status</td>'; $pg .= '<td class=dr>BTC</td>'; $pg .= '<td class=dl></td>'; $pg .= "</tr></thead>\n"; if ($ans['STATUS'] == 'ok') { $pg .= '<tbody>'; $all = array(); $count = $ans['rows']; for ($i = 0; $i < $count; $i++) { $all[] = array('payoutid' => $ans['payoutid:' . $i], 'height' => $ans['height:' . $i], 'payaddress' => $ans['payaddress:' . $i], 'amount' => $ans['amount:' . $i], 'paydate' => $ans['paydate:' . $i]); } usort($all, 'sortheight'); $hasdust = false; for ($i = 0; $i < $count; $i++) { if ($i % 2 == 0) { $row = 'even'; } else { $row = 'odd'; } $pg .= "<tr class={$row}>"; $pg .= '<td class=dl>' . $all[$i]['height'] . '</td>'; $pg .= '<td class=dl>' . $all[$i]['payaddress'] . '</td>'; $pg .= '<td class=dl> </td>'; $amount = $all[$i]['amount']; if ($amount < '10000') { $dust = '<span class=st1>*</span>'; $hasdust = true; } else { $dust = ' '; } $pg .= '<td class=dr>' . btcfmt($amount) . '</td>'; $pg .= "<td class=dl>{$dust}</td>"; $pg .= "</tr>\n"; } $pg .= '</tbody>'; if ($hasdust === true) { $pg .= '<tfoot><tr><td colspan=5 class=dc>'; $pg .= '<font size=-1><span class=st1>*</span> '; $pg .= 'Dust payments are not automatically sent out'; $pg .= '</font></td></tr></tfoot>'; } } $pg .= "</table>\n"; return $pg; }
function dopercent($data, $user) { $pg = '<h1>Address Percents</h1>'; $pg .= "<table callpadding=0 cellspacing=0 border=0>\n"; $totshare = 0; $totdiff = 0; $totinvalid = 0; $totrate = 0; $offset = 0; $blockacc = 0; $blockreward = 0; $pg .= pertitle($data, $user); $pg .= peruser($data, $user, $offset, $totshare, $totdiff, $totinvalid, $totrate, $blockacc, $blockreward, true); $pg .= pertotal($offset, $totshare, $totdiff, $totinvalid, $totrate, $blockacc, $blockreward); if ($blockacc > 0 && $blockreward > 0) { $btc = btcfmt($totdiff / $blockacc * $blockreward); $pg .= '<tr><td colspan=9 class=dc>'; $pg .= "<br>Payout est if block found at 100%: ~{$btc} BTC"; $pg .= '</td></tr>'; } $pg .= "</table>\n"; return $pg; }
function doblocks($data, $user) { $blink = '<a href=https://www.blocktrail.com/BTC/block/'; $pg = ''; if ($user === null) { $ans = getBlocks('Anon'); } else { $ans = getBlocks($user); } if (nuem(getparam('csv', true))) { $wantcsv = false; } else { $wantcsv = true; } if ($wantcsv === false) { if ($ans['STATUS'] == 'ok' and isset($ans['s_rows']) and $ans['s_rows'] > 0) { $pg .= '<h1>Block Statistics</h1>'; $pg .= "<table callpadding=0 cellspacing=0 border=0>\n"; $pg .= "<tr class=title>"; $pg .= "<td class=dl>Description</td>"; $pg .= "<td class=dr>Time</td>"; $pg .= "<td class=dr>MeanTx%</td>"; $pg .= "<td class=dr>Diff%</td>"; $pg .= "<td class=dr>Mean%</td>"; $pg .= "<td class=dr>CDF[Erl]</td>"; $pg .= "<td class=dr>Luck%</td>"; $pg .= "</tr>\n"; $since = $data['info']['lastblock']; $count = $ans['s_rows']; for ($i = 0; $i < $count; $i++) { if ($i % 2 == 0) { $row = 'even'; } else { $row = 'odd'; } $desc = $ans['s_desc:' . $i]; $age = daysago($since - $ans['s_prevcreatedate:' . $i]); $diff = number_format(100 * $ans['s_diffratio:' . $i], 2); $mean = number_format(100 * $ans['s_diffmean:' . $i], 2); $cdferl = $ans['s_cdferl:' . $i]; list($fg, $bg) = erlcolour($cdferl); $cdferldsp = "<font color={$fg}>" . number_format($cdferl, 4) . '</font>'; $bg = " bgcolor={$bg}"; $luck = number_format(100 * $ans['s_luck:' . $i], 2); $txm = number_format(100 * $ans['s_txmean:' . $i], 1); $pg .= "<tr class={$row}>"; $pg .= "<td class=dl>{$desc} Blocks</td>"; $pg .= "<td class=dr>{$age}</td>"; $pg .= "<td class=dr>{$txm}%</td>"; $pg .= "<td class=dr>{$diff}%</td>"; $pg .= "<td class=dr>{$mean}%</td>"; $pg .= "<td class=dr{$bg}>{$cdferldsp}</td>"; $pg .= "<td class=dr>{$luck}%</td>"; $pg .= "</tr>\n"; } $pg .= "</table>\n"; } if ($ans['STATUS'] == 'ok') { $count = $ans['rows']; if ($count == 1) { $num = ''; $s = ''; } else { $num = " {$count}"; $s = 's'; } $pg .= "<h1>Last{$num} Block{$s}</h1>"; } else { $pg .= '<h1>Blocks</h1>'; } list($fg, $bg) = pctcolour(25.0); $pg .= "<span style='background:{$bg}; color:{$fg};'>"; $pg .= " Green </span> "; $pg .= 'is good luck. Lower Diff% and brighter green is better luck.<br>'; list($fg, $bg) = pctcolour(100.0); $pg .= "<span style='background:{$bg}; color:{$fg};'>"; $pg .= " 100% </span> "; $pg .= 'is expected average. '; list($fg, $bg) = pctcolour(400.0); $pg .= "<span style='background:{$bg}; color:{$fg};'>"; $pg .= " Red </span> "; $pg .= 'is bad luck. Higher Diff% and brighter red is worse luck.<br><br>'; $pg .= "<table callpadding=0 cellspacing=0 border=0>\n"; $pg .= "<tr class=title>"; $pg .= "<td class=dr>#</td>"; $pg .= "<td class=dl>Height</td>"; if ($user !== null) { $pg .= "<td class=dl>Who</td>"; } $pg .= "<td class=dr>Block Reward</td>"; $pg .= "<td class=dc>When</td>"; $pg .= "<td class=dr>Status</td>"; $pg .= "<td class=dr>Diff</td>"; $pg .= "<td class=dr>Diff%</td>"; $pg .= "<td class=dr>CDF</td>"; $pg .= "<td class=dr>B</td>"; $pg .= "</tr>\n"; } $blktot = 0; $nettot = 0; $i = 0; $cnt = 0; $orph = false; $csv = "Sequence,Height,Status,Timestamp,DiffAcc,NetDiff,Hash\n"; if ($ans['STATUS'] == 'ok') { $count = $ans['rows']; for ($i = 0; $i < $count; $i++) { if ($i % 2 == 0) { $row = 'even'; } else { $row = 'odd'; } $hi = $ans['height:' . $i]; $hifld = "{$blink}{$hi}>{$hi}</a>"; $ex = ''; $conf = $ans['confirmed:' . $i]; $stat = $ans['status:' . $i]; $inf = $ans['info:' . $i]; $tt = ''; if ($conf == 'O' or $conf == 'R') { $ex = 's'; $orph = true; $seq = ''; $nn = $cnt; if ($conf == 'R') { addTips(); $in = explode(':', $inf, 2); if (trim($in[0]) != '') { $stat = trim($in[0]); } if (count($in) < 2 or trim($in[1]) == '') { $tip = 'Share diff was VERY close<br>'; $tip .= 'so we tested it,<br>'; $tip .= "but it wasn't worthy<br>"; } else { $tip = str_replace('+', '<br>', trim($in[1])); } $tt = "<span class=q onclick='tip(\"btip{$i}\",6000)'>"; $tt .= '?</span><span class=tip0>'; $tt .= "<span class=notip id=btip{$i}>"; $tt .= "{$tip}</span></span>"; } } else { $seq = $ans['seq:' . $i]; $nn = ++$cnt; } if ($conf == '1') { if (isset($data['info']['lastheight'])) { $confn = 1 + $data['info']['lastheight'] - $hi; $stat = '+' . $confn . ' Confirms'; } else { $stat = 'Conf'; } } $stara = ''; if ($conf == 'O' or $conf == 'R') { $stara = '<span class=st1>*</span>'; } if (isset($ans['statsconf:' . $i])) { if ($ans['statsconf:' . $i] == 'Y') { $approx = ''; } else { $approx = '~'; } } else { $approx = ''; } $diffacc = $ans['diffacc:' . $i]; $acc = number_format($diffacc, 0); $netdiff = $ans['netdiff:' . $i]; $diffratio = $ans['diffratio:' . $i]; $cdf = $ans['cdf:' . $i]; $luck = $ans['luck:' . $i]; if ($diffratio > 0) { $pct = 100.0 * $diffratio; list($fg, $bg) = pctcolour($pct); $bpct = "<font color={$fg}>{$approx}" . number_format($pct, 3) . '%</font>'; $bg = " bgcolor={$bg}"; $blktot += $diffacc; if ($conf != 'O' and $conf != 'R') { $nettot += $netdiff; } $cdfdsp = number_format($cdf, 3); } else { $bg = ''; $bpct = '?'; $cdfdsp = '?'; } if ($wantcsv === false) { $pg .= "<tr class={$row}>"; $pg .= "<td class=dr{$ex}>{$seq}</td>"; $pg .= "<td class=dl{$ex}>{$hifld}</td>"; if ($user !== null) { $pg .= "<td class=dl{$ex}>" . htmlspecialchars($ans['workername:' . $i]) . '</td>'; } $pg .= "<td class=dr{$ex}>" . btcfmt($ans['reward:' . $i]) . '</td>'; $pg .= "<td class=dl{$ex}>" . utcd($ans['firstcreatedate:' . $i]) . '</td>'; $pg .= "<td class=dr{$ex}>{$tt}{$stat}</td>"; $pg .= "<td class=dr>{$stara}{$approx}{$acc}</td>"; $pg .= "<td class=dr{$bg}>{$bpct}</td>"; $pg .= "<td class=dr>{$cdfdsp}</td>"; $pg .= "<td class=dr>{$nn}</td>"; $pg .= "</tr>\n"; } else { $csv .= "{$seq},"; $csv .= "{$hi},"; $csv .= "\"{$stat}\","; $csv .= $ans['firstcreatedate:' . $i] . ','; $csv .= "{$diffacc},"; $csv .= "{$netdiff},"; $csv .= $ans['blockhash:' . $i] . "\n"; } } } if ($wantcsv === true) { echo $csv; exit(0); } if ($orph === true) { $pg .= '<tr><td colspan='; if ($user === null) { $pg .= '7'; } else { $pg .= '8'; } $pg .= ' class=dc><font size=-1><span class=st1>*</span>'; $pg .= 'Orphans/Rejects count as shares but not as a block in calculations'; $pg .= '</font></td></tr>'; } $pg .= "</table>\n"; return $pg; }