|
|
|
<?php
|
|
|
|
#
|
|
|
|
function stnum($num)
|
|
|
|
{
|
|
|
|
$b4 = '';
|
|
|
|
$af = '';
|
|
|
|
$fmt = number_format($num, 0);
|
|
|
|
if ($num > 99999999)
|
|
|
|
$b4 = '<span class=urg>';
|
|
|
|
else if ($num > 9999999)
|
|
|
|
$b4 = '<span class=warn>';
|
|
|
|
if ($b4 != '')
|
|
|
|
$af = '</span>';
|
|
|
|
return $b4.$fmt.$af;
|
|
|
|
}
|
|
|
|
#
|
|
|
|
# ... Of course ... check the output and add the txin ... etc.
|
|
|
|
function calctx($ans, $count, $miner_sat, $diffacc_total)
|
|
|
|
{
|
|
|
|
$pg = '<br><table cellpadding=0 cellspacing=0 border=0>';
|
|
|
|
$pg .= '<tr><td>';
|
|
|
|
|
|
|
|
$dust = getparam('dust', true);
|
|
|
|
if (nuem($dust) || $dust <= 0)
|
|
|
|
$dust = 10000;
|
|
|
|
|
|
|
|
$fee = getparam('fee', true);
|
|
|
|
if (nuem($fee) || $fee < 0)
|
|
|
|
$fee = 0;
|
|
|
|
$fee *= 100000000;
|
|
|
|
|
|
|
|
$adr = array();
|
|
|
|
$ers = '';
|
|
|
|
$unpaid = 0;
|
|
|
|
$change = $miner_sat;
|
|
|
|
$dust_amt = 0; # not included in $change
|
|
|
|
for ($i = 0; $i < $count; $i++)
|
|
|
|
{
|
|
|
|
$username = $ans['user:'.$i];
|
|
|
|
$diffacc_user = $ans['diffacc_user:'.$i];
|
|
|
|
$pay_sat = floor($miner_sat * $diffacc_user / $diffacc_total);
|
|
|
|
$payaddress = $ans['payaddress:'.$i];
|
|
|
|
if ($payaddress == 'none')
|
|
|
|
{
|
|
|
|
$c0 = substr($username, 0, 1);
|
|
|
|
$parts = explode('.', $username);
|
|
|
|
$len = strlen($parts[0]);
|
|
|
|
if (($c0 == '1' || $c0 == '3') && $len > 26 && $len < 37)
|
|
|
|
$payaddress = $parts[0];
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if ($pay_sat > 0)
|
|
|
|
{
|
|
|
|
$dd = '';
|
|
|
|
if ($pay_sat < $dust)
|
|
|
|
$dd = ' (dust)';
|
|
|
|
$ers .= "No address for '$username'$dd<br>";
|
|
|
|
}
|
|
|
|
$unpaid += $pay_sat;
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (isset($adr[$payaddress]))
|
|
|
|
$adr[$payaddress] += $pay_sat;
|
|
|
|
else
|
|
|
|
$adr[$payaddress] = $pay_sat;
|
|
|
|
|
|
|
|
$change -= $pay_sat;
|
|
|
|
}
|
|
|
|
|
|
|
|
$txout = '';
|
|
|
|
$comma = '';
|
|
|
|
foreach ($adr as $payaddress => $pay_sat)
|
|
|
|
{
|
|
|
|
if ($pay_sat < $dust)
|
|
|
|
$dust_amt += $pay_sat;
|
|
|
|
else
|
|
|
|
{
|
|
|
|
$txout .= "$comma\"$payaddress\":".btcfmt($pay_sat);
|
|
|
|
$comma = ', ';
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if ($change > 0 || $dust_amt > 0 || $change < $fee)
|
|
|
|
{
|
|
|
|
$pg .= "<span class=err>Dust limit = $dust = ".btcfmt($dust);
|
|
|
|
$pg .= ", Dust amount = $dust_amt = ".btcfmt($dust_amt);
|
|
|
|
$pg .= ",<br>Upaid = $unpaid = ".btcfmt($unpaid);
|
|
|
|
$pg .= ", Change = $change = ".btcfmt($change);
|
|
|
|
$pg .= ",<br>Fee = $fee = ".btcfmt($fee)."</span><br>";
|
|
|
|
|
|
|
|
if ($change < $fee)
|
|
|
|
$ers .= "Change ($change) is less than Fee ($fee)<br>";
|
|
|
|
|
|
|
|
if (($dust_amt + $change - $fee) > 0)
|
|
|
|
{
|
|
|
|
$txout .= "$comma\"<changeaddress>\":";
|
|
|
|
$txout .= btcfmt($dust_amt + $change - $fee);
|
|
|
|
$comma = ', ';
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (strlen($ers) > 0)
|
|
|
|
$pg .= "<span class=err>$ers</span><br>";
|
|
|
|
|
|
|
|
$txn = '[{"txid":"<txid1>","vout":<n>},';
|
|
|
|
$txn .= '{"txid":"<txid2>","vout":<n>}] ';
|
|
|
|
$txn .= '{'.$txout.'}<br>';
|
|
|
|
|
|
|
|
$pg .= $txn.'</td></tr></table>';
|
|
|
|
return $pg;
|
|
|
|
}
|
|
|
|
#
|
|
|
|
function fmtdata($code, $val)
|
|
|
|
{
|
|
|
|
switch ($code)
|
|
|
|
{
|
|
|
|
case ',':
|
|
|
|
$ret = number_format($val);
|
|
|
|
break;
|
|
|
|
case '.':
|
|
|
|
$ret = number_format($val, 1);
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
$ret = $val;
|
|
|
|
}
|
|
|
|
return $ret;
|
|
|
|
}
|
|
|
|
#
|
|
|
|
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')."
|
|
|
|
Block: <input type=text name=blk size=10 value='$blkuse'>
|
|
|
|
Tx: <input type=text name=tx size=1 value='$tx'>
|
|
|
|
Dust (Satoshi): <input type=text name=dust size=5 value='10000'>
|
|
|
|
Fee (BTC): <input type=text name=fee size=5 value='0.0'>
|
|
|
|
<input type=submit name=Calc value=Calc>
|
|
|
|
</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 callpadding=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:'.$i];
|
|
|
|
$diffacc_percent = number_format(100.0 * $diffacc_user / $diffacc_total, 3).'%';
|
|
|
|
$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:'.$i].'</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 show_pplns($info, $page, $menu, $name, $user)
|
|
|
|
{
|
|
|
|
gopage($info, NULL, 'dopplns', $page, $menu, $name, $user);
|
|
|
|
}
|
|
|
|
#
|
|
|
|
?>
|