Created
July 13, 2017 08:50
-
-
Save sanasol/7bd371c84b915a30de65db26a297bbed to your computer and use it in GitHub Desktop.
Siacoin get balance by addresses list.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
require "vendor/autoload.php"; | |
/* | |
5018ff227a5e13e1664f9ff74d337ae4109c1708506bc0a1931efc93b766578042001a1975e6 | |
a7f15ce6e947a11eba8666290dba12190a0f4f6db8e73fd1d9e6ea0b48fd3d9e731ca0a6dcb9 | |
f34d8086947c6afa319f0e0d591495d4aa52858e17fa9bb903b39589445ab3fc32a906857584 | |
**/ | |
$addresses = file('addresses.txt'); | |
$addresses = array_filter(array_map('trim', $addresses)); | |
// | |
// $addresses = [ | |
// '5018ff227a5e13e1664f9ff74d337ae4109c1708506bc0a1931efc93b766578042001a1975e6', | |
// 'a7f15ce6e947a11eba8666290dba12190a0f4f6db8e73fd1d9e6ea0b48fd3d9e731ca0a6dcb9', | |
// 'f34d8086947c6afa319f0e0d591495d4aa52858e17fa9bb903b39589445ab3fc32a906857584', | |
// | |
// '9433bff12b3d30414a673bbfc028b0c6c0e7dd4759ebe800aebc903b351994122bc2a89d6843', | |
// '61fdad9f692c28255926edcee1f9df0b6429defea27def4257f96724a40fd81927655e1ebc29' | |
// ]; | |
$promises = []; | |
$checked = []; | |
function block_to_flat($blocks, &$flat, $level = 0, $parent_id = 0){ | |
global $client, $checked, $promises; | |
if($level > 10) { | |
return false; | |
} | |
if(!is_array($blocks)) { return false; } | |
foreach($blocks as $block){ | |
if(isset($checked[$block['height'].$parent_id])) return true; | |
$checked[$block['height'].$parent_id] = true; | |
// echo "{$block['height']}{$parent_id}".PHP_EOL; | |
foreach($block['transactions'] as $key => $tr){ | |
try { | |
$res = $client->request('GET', 'https://explorer.siahub.info/api/hash/'.$key); | |
$data = json_decode($res->getBody(), true); | |
$promise = $client->postAsync('https://explorer.siahub.info/api/blocks/', [ | |
'form_params' => [ | |
'type' => 'transactionid', | |
'hash' => $key, | |
'blocks' => array_map(function($b){return $b['height'];}, $data['blocks']), | |
] | |
])->then(function ($response) use ($level, &$flat, $key) { | |
$data = json_decode($response->getBody(), true); | |
block_to_flat($data, $flat, $level+1, $key); | |
}); | |
$flat[$key] = [ | |
'id' => $key, | |
'parent_id' => $parent_id, | |
'type' => 'transaction' | |
]; | |
} catch(Exception $e) {} | |
if(isset($tr['siacoinoutputs'])) { | |
foreach($tr['siacoinoutputs'] as $out) { | |
try { | |
$res = $client->request('GET', 'https://explorer.siahub.info/api/hash/'.$out['id']); | |
$data = json_decode($res->getBody(), true); | |
$promise = $client->postAsync('https://explorer.siahub.info/api/blocks/', [ | |
'form_params' => [ | |
'type' => 'siacoinoutputid', | |
'hash' => $out['id'], | |
'blocks' => array_map(function($b){return $b['height'];}, $data['blocks']), | |
] | |
])->then(function ($response) use ($level, &$flat, $out) { | |
$data = json_decode($response->getBody(), true); | |
block_to_flat($data, $flat, $level+1, $out['id']); | |
}); | |
$promises[] = $promise; | |
} catch(Exception $e) {} | |
$flat[$out['id']] = [ | |
'id' => $out['id'], | |
'parent_id' => $key, | |
'raw' => $out, | |
'type' => 'out' | |
]; | |
} | |
} | |
if(isset($tr['siacoininputs'])) { | |
foreach($tr['siacoininputs'] as $parent => $in) { | |
$flat['in_'.$parent] = [ | |
'parent_id' => $parent, | |
'id' => 'in_'.$parent, | |
'raw' => $in, | |
'type' => 'in' | |
]; | |
} | |
} | |
} | |
} | |
} | |
$client = new \GuzzleHttp\Client(); | |
$flatdata = []; | |
foreach($addresses as $address) { | |
try { | |
$res = $client->request('GET', 'https://explorer.siahub.info/api/hash/'.$address); | |
$data = json_decode($res->getBody(), true); | |
// error_log(var_export((string)$res->getBody(), true)); | |
// die(); | |
$promise = $client->postAsync('https://explorer.siahub.info/api/blocks/', [ | |
'form_params' => [ | |
'type' => 'unlockhash', | |
'hash' => $address, | |
'blocks' => array_map(function($b){return $b['height'];}, $data['blocks']), | |
] | |
])->then(function ($response) use ($address, &$flatdata) { | |
$flatdata[$address] = [ | |
'id' => $address, | |
'parent_id' => 0, | |
'type' => 'address' | |
]; | |
$data = json_decode($response->getBody(), true); | |
block_to_flat($data, $flatdata, 0, $address); | |
}); | |
$promises[] = $promise; | |
} catch(Exception $e) {} | |
error_log($address); | |
} | |
foreach($promises as $promise) { | |
error_log('wait'); | |
$promise->wait(); | |
} | |
// | |
// function buildTree(array &$elements, $parentId = 0) { | |
// $branch = array(); | |
// | |
// foreach ($elements as $element) { | |
// if ($element['parent_id'] == $parentId) { | |
// echo "build {$element['id']} p:{$parentId} eP:{$element['parent_id']}".PHP_EOL; | |
// unset($elements[$element['id']]); | |
// $children = buildTree($elements, $element['id']); | |
// if ($children) { | |
// $element['children'] = $children; | |
// } | |
// $branch[$element['id']] = $element; | |
// } | |
// } | |
// return $branch; | |
// } | |
echo "<pre>"; | |
//print_r($flatdata); | |
$ins = []; | |
$outs = []; | |
$counted = []; | |
$ocounted = []; | |
$spend = []; | |
foreach ($flatdata as $key => $value) { | |
if($value['type'] == "in") { | |
foreach($flatdata as $serachout){ | |
if($serachout['type'] == "out" && $serachout['id'] == $value['parent_id']) { | |
$out = $serachout['raw']; | |
} | |
} | |
if(!isset($counted[$value['parent_id']])) { | |
$counted[$value['parent_id']] = true; | |
$ins[$out['unlockhash']] += $out['value']/1e24; | |
} | |
} | |
if($value['type'] == "out") { | |
if(!isset($ocounted[$value['id']])) { | |
$spent = false; | |
foreach($flatdata as $serachout){ | |
if($serachout['type'] == "in" && $serachout['parent_id'] == $value['id']) { | |
$spent = true; | |
} | |
} | |
$ocounted[$value['id']] = true; | |
if($spent) { | |
$spend[$value['raw']['unlockhash']] += $value['raw']['value']/1e24; | |
} | |
//if(!$spent) { | |
$outs[$value['raw']['unlockhash']] += $value['raw']['value']/1e24; | |
//} | |
} | |
} | |
} | |
foreach($outs as $addr => $out) { | |
if(in_array($addr, $addresses)) { | |
} | |
$in = $ins[$addr]; | |
$spent = $spend[$addr]; | |
echo "(".((in_array($addr, $addresses)) ? "+++":"---")."){$addr} - Out: {$out} SC ---- in: {$in} SC ---- Spent: {$spent} SC<br>"; | |
if(in_array($addr, $addresses) && empty($spent)) { | |
$balance = $out; | |
} | |
} | |
echo "<h3>current balance: {$balance} SC</h3>"; | |
// var_dump(buildTree($flatdata)); | |
// | |
// | |
// $request = new \GuzzleHttp\Psr7\Request('GET', 'https://explorer.siahub.info/api/hash/hash'); | |
// | |
// $promise = $client->sendAsync($request)->then(function ($response) { | |
// echo 'I completed! ' . $response->getBody(); | |
// }); | |
function has_children($rows,$id) { | |
foreach ($rows as $row) { | |
if ($row['parent_id'] == $id) | |
return true; | |
} | |
return false; | |
} | |
function build_menu($rows,$parent=0) | |
{ | |
$result = "<ul>"; | |
foreach ($rows as $row) | |
{ | |
if ($row['parent_id'] == $parent){ | |
$result.= "<li>{$row['id']} - {$row['type']}"; | |
unset($rows[$row['id']]); | |
if (has_children($rows,$row['id'])) | |
$result.= build_menu($rows,$row['id']); | |
$result.= "</li>"; | |
} | |
} | |
$result.= "</ul>"; | |
return $result; | |
} | |
echo build_menu($flatdata); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment