Con Kolivas
10 years ago
10 changed files with 2843 additions and 254 deletions
@ -0,0 +1,327 @@ |
|||||||
|
<?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:'.$i]; |
||||||
|
$pay_sat = $ans['amount:'.$i]; |
||||||
|
$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 dopplns2($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('pplns2')." |
||||||
|
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); |
||||||
|
$msg = msgEncode('pplns2', 'pplns2', $flds, $user); |
||||||
|
$rep = sendsockreply('pplns2', $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 = $ans['miner_reward']; |
||||||
|
$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:'.$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 = $ans['amount:'.$i]; |
||||||
|
$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_pplns2($info, $page, $menu, $name, $user) |
||||||
|
{ |
||||||
|
gopage($info, NULL, 'dopplns2', $page, $menu, $name, $user); |
||||||
|
} |
||||||
|
# |
||||||
|
?> |
@ -0,0 +1,101 @@ |
|||||||
|
SET SESSION AUTHORIZATION 'postgres'; |
||||||
|
|
||||||
|
BEGIN transaction; |
||||||
|
|
||||||
|
DO $$ |
||||||
|
DECLARE ver TEXT; |
||||||
|
BEGIN |
||||||
|
|
||||||
|
UPDATE version set version='1.0.0' where vlock=1 and version='0.9.6'; |
||||||
|
|
||||||
|
IF found THEN |
||||||
|
RETURN; |
||||||
|
END IF; |
||||||
|
|
||||||
|
SELECT version into ver from version |
||||||
|
WHERE vlock=1; |
||||||
|
|
||||||
|
RAISE EXCEPTION 'Wrong DB version - expect "0.9.6" - found "%"', ver; |
||||||
|
|
||||||
|
END $$; |
||||||
|
|
||||||
|
DROP TABLE payments; |
||||||
|
CREATE TABLE payments ( |
||||||
|
paymentid bigint NOT NULL, -- unique per record |
||||||
|
payoutid bigint NOT NULL, |
||||||
|
userid bigint NOT NULL, |
||||||
|
subname character varying(256) NOT NULL, |
||||||
|
paydate timestamp with time zone NOT NULL, |
||||||
|
payaddress character varying(256) DEFAULT ''::character varying NOT NULL, |
||||||
|
originaltxn character varying(256) DEFAULT ''::character varying NOT NULL, |
||||||
|
amount bigint NOT NULL, -- satoshis |
||||||
|
diffacc float DEFAULT 0 NOT NULL, |
||||||
|
committxn character varying(256) DEFAULT ''::character varying NOT NULL, |
||||||
|
commitblockhash character varying(256) DEFAULT ''::character varying NOT NULL, |
||||||
|
createdate timestamp with time zone NOT NULL, |
||||||
|
createby character varying(64) DEFAULT ''::character varying NOT NULL, |
||||||
|
createcode character varying(128) DEFAULT ''::character varying NOT NULL, |
||||||
|
createinet character varying(128) DEFAULT ''::character varying NOT NULL, |
||||||
|
expirydate timestamp with time zone DEFAULT '6666-06-06 06:06:06+00', |
||||||
|
PRIMARY KEY (paymentid, expirydate) |
||||||
|
); |
||||||
|
CREATE UNIQUE INDEX payuserid ON payments USING btree (payoutid, userid, subname, payaddress, originaltxn, expirydate); |
||||||
|
|
||||||
|
DROP TABLE accountbalance; |
||||||
|
CREATE TABLE accountbalance ( -- summarised from miningpayouts and payments - RAM only |
||||||
|
userid bigint NOT NULL, |
||||||
|
confirmedpaid bigint DEFAULT 0 NOT NULL, -- satoshis |
||||||
|
confirmedunpaid bigint DEFAULT 0 NOT NULL, -- satoshis |
||||||
|
pendingconfirm bigint DEFAULT 0 NOT NULL, -- satoshis |
||||||
|
heightupdate integer not NULL, |
||||||
|
createdate timestamp with time zone NOT NULL, |
||||||
|
createby character varying(64) DEFAULT ''::character varying NOT NULL, |
||||||
|
createcode character varying(128) DEFAULT ''::character varying NOT NULL, |
||||||
|
createinet character varying(128) DEFAULT ''::character varying NOT NULL, |
||||||
|
modifydate timestamp with time zone DEFAULT '6666-06-06 06:06:06+00', |
||||||
|
modifyby character varying(64) DEFAULT ''::character varying NOT NULL, |
||||||
|
modifycode character varying(128) DEFAULT ''::character varying NOT NULL, |
||||||
|
modifyinet character varying(128) DEFAULT ''::character varying NOT NULL, |
||||||
|
PRIMARY KEY (userid) |
||||||
|
); |
||||||
|
|
||||||
|
DROP TABLE miningpayouts; |
||||||
|
CREATE TABLE miningpayouts ( |
||||||
|
payoutid bigint NOT NULL, |
||||||
|
userid bigint NOT NULL, |
||||||
|
diffacc float DEFAULT 0 NOT NULL, |
||||||
|
amount bigint DEFAULT 0 NOT NULL, -- satoshis |
||||||
|
createdate timestamp with time zone NOT NULL, |
||||||
|
createby character varying(64) DEFAULT ''::character varying NOT NULL, |
||||||
|
createcode character varying(128) DEFAULT ''::character varying NOT NULL, |
||||||
|
createinet character varying(128) DEFAULT ''::character varying NOT NULL, |
||||||
|
expirydate timestamp with time zone DEFAULT '6666-06-06 06:06:06+00', |
||||||
|
PRIMARY KEY (payoutid, userid, expirydate) |
||||||
|
); |
||||||
|
|
||||||
|
CREATE TABLE payouts ( |
||||||
|
payoutid bigint NOT NULL, -- unique per record |
||||||
|
height integer not NULL, |
||||||
|
blockhash character varying(256) NOT NULL, |
||||||
|
minerreward bigint NOT NULL, -- satoshis |
||||||
|
workinfoidstart bigint NOT NULL, |
||||||
|
workinfoidend bigint NOT NULL, -- should be block workinfoid |
||||||
|
elapsed bigint NOT NULL, |
||||||
|
status char DEFAULT ' ' NOT NULL, |
||||||
|
diffwanted float DEFAULT 0 NOT NULL, |
||||||
|
diffused float DEFAULT 0 NOT NULL, |
||||||
|
shareacc float DEFAULT 0 NOT NULL, |
||||||
|
lastshareacc timestamp with time zone NOT NULL, |
||||||
|
stats text DEFAULT ''::text NOT NULL, |
||||||
|
createdate timestamp with time zone NOT NULL, |
||||||
|
createby character varying(64) DEFAULT ''::character varying NOT NULL, |
||||||
|
createcode character varying(128) DEFAULT ''::character varying NOT NULL, |
||||||
|
createinet character varying(128) DEFAULT ''::character varying NOT NULL, |
||||||
|
expirydate timestamp with time zone DEFAULT '6666-06-06 06:06:06+00', |
||||||
|
PRIMARY KEY (payoutid, expirydate) |
||||||
|
); |
||||||
|
CREATE UNIQUE INDEX payoutsblock ON payouts USING btree (height, blockhash, expirydate); |
||||||
|
|
||||||
|
insert into idcontrol (idname,lastid,createdate,createby) values ('payoutid',999,now(),'1.0.0update'); |
||||||
|
|
||||||
|
END transaction; |
Loading…
Reference in new issue