p2pkh($bitcoinPrefixes), $slip132->p2shP2wpkh($bitcoinPrefixes), $slip132->p2wpkh($bitcoinPrefixes), ]) ]); $serializer = new Base58ExtendedKeySerializer(new ExtendedKeySerializer($adapter, $config)); function compute_scripthash_status($scriptpubkey_id) { $txs = db_query("SELECT DISTINCT txid, tx_height FROM txs JOIN txos ON ( txos.create_txid_id = txs.txid_id OR txos.destroy_txid_id = txs.txid_id ) JOIN txids USING ( txid_id ) WHERE scriptpubkey_id = ? ORDER BY tx_height, tx_pos", $scriptpubkey_id); $status = ''; foreach ($txs as $tx) { $status .= $tx['txid'].':'.$tx['tx_height'].':'; } //echo("status: $status\n"); return ($status == '')?'':hash('sha256', $status); } function getParsedXPUB($xpub) { global $serializer, $btc; return $serializer->parse($btc, $xpub); } function getAddressFast($parsedXPUB, $path) { global $btc, $addrCreator; return $parsedXPUB->derivePath($path)->getAddress($addrCreator)->getAddress($btc); } function getAddress($xpub, $path) { return getAddressFast(getParsedXPUB($xpub), $path); } function getScriptPubKey($address) { global $addrCreator, $btc; return $addrCreator->fromString($address, $btc)->getScriptPubKey()->getBinary(); } function calcReverseHash($data) { return bin2hex(strrev(hash('sha256',$data, true))); } function getReverseScriptHash($address) { //global $addrCreator, $btc; //$wsh = $addrCreator->fromString($address, $btc)->getScriptPubKey()->getWitnessScriptHash()->getBinary(); //return bin2hex(strrev($wsh)); return calcReverseHash(getScriptPubKey($address)); } function rpc_electrum($method) { global $electrum_server_address, $electrum_server_port; $args = func_get_args(); array_shift($args); $json_in = json_encode(array('jsonrpc' => '1.0', 'id' => true, 'method' => $method, 'params' => $args))."\n"; $socket = fsockopen($electrum_server_address, $electrum_server_port); if (!$socket) fatal("unable to connect to $electrum_server_address:$electrum_server_port"); $length = strlen($json_in); //echo("writing a message of size $length\n"); $written = fwrite($socket, $json_in); if ($written === false) fatal("error sending JSONRPC message to server"); else if ($written < $length) fatal("short write to server"); $json_out = fgets($socket); if ($json_out === false) fatal('error performing rpc'); $ret = json_decode($json_out, true); if ($ret === null) fatal("JSON encoded data cannot be decoded"); if ($ret['error'] !== null) { // some addresses have a 'too large' history, electrumx bails and this // code allows us to ignore the error, hopefully the address is not that important if ($method == 'blockchain.scripthash.subscribe' && $ret['error']['code'] == 1) { echo("warning: history too large of scripthash {$args[0]}\n"); return NULL; } fatal("there was an errer performing rpc"); } return $ret['result']; } function rpc_bitcoin($method) { global $rpcuser, $rpcpass; $args = func_get_args(); array_shift($args); $json_in = json_encode(array('jsonrpc' => '1.0', 'id' => true, 'method' => $method, 'params' => $args)); $ch = curl_init('http://127.0.0.1:8332'); curl_setopt($ch, CURLOPT_USERPWD, $rpcuser.':'.$rpcpass); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $json_in); $json_out= curl_exec($ch); if ($json_out === false) fatal('error performing rpc'); $ret = json_decode($json_out, true); if ($ret === null) fatal("JSON encoded data cannot be decoded"); if ($ret['error'] !== null) fatal("there was an errer performing rpc"); return $ret['result']; } function get_scriptpubkey_id($scriptPubKey, $address) { if (!strlen($scriptPubKey)) { die("scriptPubKey is empty"); } db_direct('LOCK TABLES scriptpubkeys WRITE'); $scriptpubkey_id = db_single_field('SELECT scriptpubkey_id FROM scriptpubkeys WHERE scriptpubkey = ?', $scriptPubKey); if (!$scriptpubkey_id) { db_exec('INSERT INTO scriptpubkeys ( scriptpubkey, address, reverse_scriptpubkey_hash ) VALUES ( ?, ?, ? )', $scriptPubKey, $address, calcReverseHash($scriptPubKey)); $scriptpubkey_id = db_last_insert_id(); } db_direct('UNLOCK TABLES'); return $scriptpubkey_id; } function showtx($txid_id) { $tx = db_single_row('SELECT * FROM txs JOIN txids USING (txid_id) WHERE txid_id = ?', $txid_id); echo("-------------\n"); echo("{$tx['tx_blocktime']} {$tx['tx_fee']} {$tx['txid']}\n"); $vouts = db_query('SELECT * FROM txos JOIN scriptpubkeys USING (scriptpubkey_id) LEFT JOIN walletpaths USING (walletpath_id) LEFT JOIN wallets USING (wallet_id) LEFT JOIN owners2wallets USING (wallet_id) LEFT JOIN owners USING (owner_id) WHERE create_txid_id = ?', $tx['txid_id']); while (($vout = mysqli_fetch_assoc($vouts))) { echo("{$vout['address']} {$vout['txo_value']} {$vout['wallet_desc']} ({$vout['owner_name']})\n"); //print_r($vout); } $vins = db_query('SELECT * FROM txos JOIN scriptpubkeys USING (scriptpubkey_id) LEFT JOIN walletpaths USING (walletpath_id) LEFT JOIN wallets USING (wallet_id) LEFT JOIN owners2wallets USING (wallet_id) LEFT JOIN owners USING (owner_id) WHERE destroy_txid_id = ?', $tx['txid_id']); while (($vin = mysqli_fetch_assoc($vins))) { echo("{$vin['address']} -{$vin['txo_value']} {$vin['wallet_desc']} ({$vin['owner_name']})\n"); //print_r($vin); } } function showtx_web($txid, $format) { switch ($format) { case 'owner': $action = 'owner.php'; $select = <<') c, EOS; $group_by = 'color_id, owners'; break; case 'wallet': $action = 'wallet.php'; $select = <<'), '') c, CONCAT(IFNULL(CONCAT('', COUNT(DISTINCT IF(txid_id = destroy_txid_id, scriptpubkey_id, NULL)), ''), '0'), '/', IFNULL(CONCAT('', COUNT(DISTINCT IF(txid_id = create_txid_id, scriptpubkey_id, NULL)), ''), '0')) `i/o`, IFNULL(CONCAT('', wallet_desc, ''), 'unknown') wallet, EOS; $group_by = 'color_id, owners, wallet'; break; case 'address': $action = 'address.php'; $select = <<') c, CONCAT(SUM(IFNULL(txid_id = destroy_txid_id, 0)), '/', SUM(txid_id = create_txid_id)) `i/o`, IFNULL(CONCAT('', CONCAT(address, IFNULL(CONCAT(' (', leaf, idx, ')'), '')), ''), '-') address, IFNULL(CONCAT('', wallet_desc, ''), 'unknown') wallet, EOS; $group_by = 'color_id, owners, wallet, address'; break; case 'txo': default: $action = 'tx.php'; $format = 'txo'; $select = <<') c, IF(txid_id = destroy_txid_id, CONCAT('vin:', destroy_txo_index), CONCAT('vout:', create_txo_index, IFNULL(CONCAT(''), IF(wallet_id IS NULL, '→?', '') ) ) ) txo, IFNULL(CONCAT('', address, ''), '-') address, IFNULL(CONCAT('', wallet_desc, ''), 'unknown') wallet, EOS; $group_by = 'color_id, owners, wallet, address, txo'; break; } ?>
', owners, ''), 'none') owners, IF(color_id != 1, CONCAT(color_abbrev, ' ', FORMAT(color_factor*SUM(IF(txid_id = destroy_txid_id, -1, 1)*txo_value), color_round)), CONCAT('BTC ', SUM(IF(txid_id = destroy_txid_id, -1, 1)*txo_value))) value, CONCAT('USD ', FORMAT(SUM(IF(txid_id = destroy_txid_id, -1, 1)*txo_value)*price_usd, 2)) price FROM txos JOIN txids ON ( txid_id = create_txid_id OR txid_id = destroy_txid_id ) JOIN txs USING (txid_id) LEFT JOIN prices ON price_date = DATE(tx_blocktime) LEFT JOIN scriptpubkeys USING (scriptpubkey_id) LEFT JOIN walletpaths USING (walletpath_id) LEFT JOIN paths USING (path_id) LEFT JOIN wallets USING (wallet_id) LEFT JOIN colors USING (color_id) LEFT JOIN ( SELECT wallet_id, GROUP_CONCAT(owner_name) owners, GROUP_CONCAT(owner_id) owner_ids FROM owners2wallets JOIN owners USING (owner_id) GROUP BY wallet_id ) AS bla USING (wallet_id) WHERE txid_id = ? GROUP BY $group_by ORDER BY IF(txid_id = destroy_txid_id, 1, 0), IF(txid_id = destroy_txid_id, destroy_txo_index, create_txo_index) EOQ, $tx['txid_id']); ?>

fee BTC