| ScriptPubKey | : OP_HASH160 <redeemScriptHash> OP_EQUAL |
| ScriptSig | : <redeemScript> |
<?php
use BitWasp\Bitcoin\Bitcoin;
use BitWasp\Buffertools\Buffer;
use BitWasp\Bitcoin\Network\NetworkFactory;
use BitWasp\Bitcoin\Address\ScriptHashAddress;
use BitWasp\Bitcoin\Script\ScriptFactory;
include_once "../libraries/vendor/autoload.php";
include_once("html_iframe_header.php");
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
try {
$networkClass = $_POST['network'];
Bitcoin::setNetwork(NetworkFactory::$networkClass());
$network = Bitcoin::getNetwork();
if (ctype_xdigit($_POST['redeem_script'])) {
$scriptPubKey = ScriptFactory::fromHex($_POST['redeem_script']);
$opcodes = $scriptPubKey->getOpcodes();
$p2sh = new ScriptHashAddress($scriptPubKey->getScriptHash());
$p2shAddress = $p2sh->getAddress();
} else {
throw new Exception("Redeem script must be hex.");
}
?>
<div class="table-responsive">
<table border=0 class='table'>
<tr style='background-color:#f0f0f0'><td>Base58 address</td><td><?php echo $p2shAddress;?></td></tr>
<tr><td>Redeem Script Hex </td><td><?php echo $scriptPubKey->getHex();?></td></tr>
<tr><td>Redeem Script Asm</td>
<td>
<?php echo $scriptPubKey->getScriptParser()->getHumanReadable();?>
</td>
</tr>
<tr><td>Redeem Script Hash Hex</td><td><?php echo $scriptPubKey->getScriptHash()->getHex();?></td></tr>
<tr style='background-color:#f0f0f0'><td>ScriptPubKey Hex </td><td><?php echo $p2sh->getScriptPubKey()->getHex()?></td></tr>
<tr style='background-color:#f0f0f0'><td>ScriptPubKey Asm</td>
<td>
<?php
foreach( $p2sh->getScriptPubKey()->getScriptParser()->decode() as $operation ) {
if ($operation->isPush()) {
echo htmlentities("<{$operation->getData()->getHex()}> ");
} else {
echo $opcodes->getOp($operation->getOp()) . " " ;
}
}
?>
</td>
</tr>
</table>
</div>
<?php
} catch (Exception $e) {
$errmsg .= "Problem found. " . $e->getMessage();
}
}
if ($errmsg) {
?>
<div class="alert alert-danger">
<strong>Error!</strong> <?php echo $errmsg?>
</div>
<?php
}
?>
<form action='' method='post'>
<div class="form-group">
<label for="network">Network:</label>
<select id="network" name="network" class="form-control" >
<?php
$networks = get_class_methods(new NetworkFactory());
foreach($networks as $network) {
echo "<option value='{$network}'".($network == $_POST['network'] ? " selected": "").">{$network}</option>";
}
?>
</select>
</div>
<div class="form-group">
<label for="redeem_script">Redeem Script (Hex)</label>
<input class="form-control" type='text' name='redeem_script' id='redeem_script' value='<?php echo $_POST['redeem_script']?>'>
* This script should be saved and should be shared with all the participants before a payment is made, so they may validate the authenticity of the address, it will also be used later to release the bitcoins.
</div>
<input type='submit' class="btn btn-success btn-block"/>
</form>
<?php
include_once("html_iframe_footer.php");
<?php
use BitWasp\Buffertools\Buffer;
use BitWasp\Bitcoin\Script\ScriptFactory;
include_once "../libraries/vendor/autoload.php";
include_once("html_iframe_header.php");
?>
<div class='row'>
<?php
$redeemScript = ScriptFactory::create()->op('OP_5')->op('OP_ADD')->op('OP_6')->op('OP_EQUAL')->getScript();
?>
<div class="col-sm-12">
<h6 class="mt-3" title="Redeem script plays important roles in both lock and unlock tx. That is, unlock tx requires redeem script while lock tx requires redeem script hash.">Redeem Script</h6>
<div class='row'>
<div class="col-sm-1">
Hex
</div>
<div class="col-sm-11">
<textarea class="form-control" rows="1" readonly><?php echo $redeemScript->getHex();?></textarea> <a href='#hashtag1' onclick="javascript:parent.moveData($(this).prev().val(),'iframe_p2sh_address', 'redeem_script')">Insert</a>
</div>
</div>
<div class='row'>
<?php
$opcodes = $redeemScript->getOpcodes();
?>
<div class="col-sm-1">
Asm
</div>
<div class="col-sm-11"><textarea class="form-control" rows="1" readonly>
<?php
$opcodes = $redeemScript->getOpcodes();
foreach( $redeemScript->getScriptParser()->decode() as $operation ) {
try {
$op = $opcodes->getOp($operation->getOp());
} catch (\RuntimeException $e) {
$op = "";
}
echo $op ? $op . " " : "";
if ($op != 'OP_0' AND $operation->isPush()) {
$bytes = (int)ltrim($op, 'OP_PUSHDATA');
$bytes = $bytes > 0 ? $bytes : 1;
$hexsize = Buffer::int($operation->getDataSize(), $bytes)->getHex();
echo htmlentities("{$hexsize}<{$operation->getData()->getHex()}> ");
}
}
?>
</textarea>
</div>
</div>
</div>
<div class="col-sm-6">
<h6 class="mt-3" title="Spend requires ScriptSig to unlock unspent tx output.">Unlock Script (ScriptSig)</h6>
<div class='row'>
<?php
$scriptSig = ScriptFactory::create()->op('OP_1')->push($redeemScript->getBuffer())->getScript();
?>
<div class="col-sm-1">
Hex
</div>
<div class="col-sm-11"><textarea class="form-control" rows="1" readonly><?php echo $scriptSig->getHex();?></textarea>
</div>
</div>
<div class='row'>
<div class="col-sm-1">
Asm
</div>
<div class="col-sm-11">
<textarea class="form-control" rows="1" readonly>
<?php
$opcodes = $scriptSig->getOpcodes();
foreach( $scriptSig->getScriptParser()->decode() as $operation ) {
try {
$op = $opcodes->getOp($operation->getOp());
} catch (\RuntimeException $e) {
$op = "";
}
echo $op ? $op . " " : "";
if ($op != 'OP_0' AND $operation->isPush()) {
$bytes = (int)ltrim($op, 'OP_PUSHDATA');
$bytes = $bytes > 0 ? $bytes : 1;
$hexsize = Buffer::int($operation->getDataSize(), $bytes)->getHex();
echo htmlentities("{$hexsize}<{$operation->getData()->getHex()}> ");
}
}
?>
</textarea>
</div>
</div>
</div>
<div class="col-sm-6">
<h6 class="mt-3" title="scriptPubKey requires redeemScriptHash.">Lock Script (RedeemScriptHash)</h6>
<div class='row'>
<div class="col-sm-1">
Hex
</div>
<div class="col-sm-11"><textarea class="form-control" rows="1" readonly><?php echo $redeemScript->getScriptHash()->getHex()?></textarea>
</div>
</div>
</div>
</div>
<?php
include_once("html_iframe_footer.php");
<?php
use BitWasp\Buffertools\Buffer;
use BitWasp\Bitcoin\Script\ScriptFactory;
include_once "../libraries/vendor/autoload.php";
include_once("html_iframe_header.php");
$redeemScript = ScriptFactory::create()->op('OP_2')->push(Buffer::hex("04a882d414e478039cd5b52a92ffb13dd5e6bd4515497439dffd691a0f12af9575fa349b5694ed3155b136f09e63975a1700c9f4d4df849323dac06cf3bd6458cd"))->push(Buffer::hex("046ce31db9bdd543e72fe3039a1f1c047dab87037c36a669ff90e28da1848f640de68c2fe913d363a51154a0c62d7adea1b822d05035077418267b1a1379790187"))->push(Buffer::hex("0411ffd36c70776538d079fbae117dc38effafb33304af83ce4894589747aee1ef992f63280567f52f5ba870678b4ab4ff6c8ea600bd217870a8b4f1f09f3a8e83"))->op('OP_3')->op('OP_CHECKMULTISIG')->getScript();
?>
<div class='row'>
<div class="col-sm-1">
Hex
</div>
<div class="col-sm-11">
<textarea class="form-control" rows="3" readonly><?php echo $redeemScript->getHex();?></textarea>
<a href='#hashtag1' onclick="javascript:$('input#redeem_script').val($(this).prev().val());setTimeout(function() { $('input#redeem_script').focus(); }, 500);">Insert</a>
</div>
<?php
$opcodes = $redeemScript->getOpcodes();
?>
<div class="col-sm-1">
Asm
</div>
<div class="col-sm-11">
<textarea class="form-control" rows="3" readonly>
<?php
$opcodes = $redeemScript->getOpcodes();
foreach( $redeemScript->getScriptParser()->decode() as $operation ) {
try {
$op = $opcodes->getOp($operation->getOp());
} catch (\RuntimeException $e) {
$op = "";
}
echo $op ? $op . " " : "";
if ($op != 'OP_0' AND $operation->isPush()) {
$bytes = (int)ltrim($op, 'OP_PUSHDATA');
$bytes = $bytes > 0 ? $bytes : 1;
$hexsize = Buffer::int($operation->getDataSize(), $bytes)->getHex();
echo htmlentities("{$hexsize}<{$operation->getData()->getHex()}> ");
}
}
?>
</textarea>
</div>
<div class="col-sm-12">
<h6 class="mt-3" title="Spend requires ScriptSig to unlock unspent tx output.">Unlock Script (ScriptSig)</h6>
<div class='vertical-line-green'>
<div class='row'>
<div class="col-sm-12">
<?php echo htmlentities("OP_0 <Sig1> <Sig3> OP_PUSHDATA1 <redeemScript>")?>
</div>
</div>
<div class='row'>
<div class="col-sm-12">
of course the following signature combination <?php echo htmlentities("<Sig1> <Sig2>")?>, <?php echo htmlentities("<Sig2> <Sig3>")?>, <?php echo htmlentities("<Sig1> <Sig2> <Sig3>")?> are valid too.
</div>
</div>
</div>
<div class='row'>
<?php
$scriptSig = ScriptFactory::create()->op('OP_0')->push(Buffer::hex("30440220762ce7bca626942975bfd5b130ed3470b9f538eb2ac120c2043b445709369628022051d73c80328b543f744aa64b7e9ebefa7ade3e5c716eab4a09b408d2c307ccd701"))->push(Buffer::hex("3045022100abf740b58d79cab000f8b0d328c2fff7eb88933971d1b63f8b99e89ca3f2dae602203354770db3cc2623349c87dea7a50cee1f78753141a5052b2d58aeb592bcf50f01"))->push($redeemScript->getBuffer())->getScript();
?>
<div class="col-sm-1">
Hex
</div>
<div class="col-sm-11">
<textarea class="form-control" rows="3" readonly><?php echo $scriptSig->getHex();?></textarea>
</div>
</div>
<div class='row'>
<div class="col-sm-1">
Asm
</div>
<div class="col-sm-11">
<textarea class="form-control" rows="3" readonly>
<?php
$opcodes = $scriptSig->getOpcodes();
foreach( $scriptSig->getScriptParser()->decode() as $operation ) {
try {
$op = $opcodes->getOp($operation->getOp());
} catch (\RuntimeException $e) {
$op = "";
}
echo $op ? $op . " " : "";
if ($op != 'OP_0' AND $operation->isPush()) {
$bytes = (int)ltrim($op, 'OP_PUSHDATA');
$bytes = $bytes > 0 ? $bytes : 1;
$hexsize = Buffer::int($operation->getDataSize(), $bytes)->getHex();
echo htmlentities("{$hexsize}<{$operation->getData()->getHex()}> ");
}
}
?>
</textarea>
</div>
</div>
</div>
<div class="col-sm-12">
<h6 class="mt-3" title="scriptPubKey requires redeemScriptHash.">Lock Script (RedeemScriptHash)</h6>
<div class='row'>
<div class="col-sm-1">
Hex
</div>
<div class="col-sm-11"><textarea class="form-control" rows="1" readonly><?php echo $redeemScript->getScriptHash()->getHex()?></textarea>
</div>
</div>
</div>
</div>
<?php
include_once("html_iframe_footer.php");
<?php
use BitWasp\Bitcoin\Bitcoin;
use BitWasp\Buffertools\Buffer;
use BitWasp\Bitcoin\Network\NetworkFactory;
use BitWasp\Bitcoin\Key\Factory\PrivateKeyFactory;
use BitWasp\Bitcoin\Address\AddressCreator;
use BitWasp\Bitcoin\Address\Base58AddressInterface;
use BitWasp\Bitcoin\Transaction\Factory\TxBuilder;
use BitWasp\Bitcoin\Transaction\TransactionFactory;
use BitWasp\Bitcoin\Transaction\TransactionOutput;
use BitWasp\Bitcoin\Transaction\Factory\Signer;
use BitWasp\Bitcoin\Script\ScriptFactory;
use BitWasp\Bitcoin\Script\Classifier\OutputClassifier;
use BitWasp\Bitcoin\Script\ScriptType;
include_once "../libraries/vendor/autoload.php";
$noOfInputs = 10;
$noOfOutputs = 1;
include_once("html_iframe_header.php");
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
try {
$networkClass = $_POST['network'];
Bitcoin::setNetwork(NetworkFactory::$networkClass());
$network = Bitcoin::getNetwork();
$ecAdapter = Bitcoin::getEcAdapter();
$privKeyFactory = new PrivateKeyFactory();
$addrCreator = new AddressCreator();
$spendTx = TransactionFactory::build();
$signItems = [];
if (!is_numeric($_POST['no_of_inputs']) OR !is_numeric($_POST['no_of_outputs'])) {
throw new Exception("Error in 'no_of_inputs' or 'no_of_outputs'.");
}
foreach(range(1,$_POST['no_of_inputs']) as $thisInput) {
$utxoHash = trim($_POST["utxo_hash_{$thisInput}"]);
$utxoNOutput = trim($_POST["utxo_n_{$thisInput}"]);
$privkeyhex = trim($_POST["privkey_{$thisInput}"]);
$utxoScript = trim($_POST["utxo_script_{$thisInput}"]);
if (strlen($utxoHash)>0 AND strlen($utxoNOutput) > 0 AND strlen($privkeyhex) > 0) {
$spendTx = $spendTx->input($utxoHash, $utxoNOutput);
$signItems[] = [$privkeyhex, $utxoScript];
} else {
throw new Exception("Error in 'input#{$thisInput}'.");
}
}
foreach(range(1,$_POST['no_of_outputs']) as $thisOutput) {
$address = trim($_POST["address_{$thisOutput}"]);
$amount = trim($_POST["amount_{$thisOutput}"]);
$recipient = $addrCreator->fromString($address);
if (!strlen($address)>0 or !strlen($amount)>0) {
throw new Exception("Error in 'output#{$thisOutput}'.");
}
if (!$recipient instanceof Base58AddressInterface) {
throw new Exception("Invalid P2SH address in 'output#{$thisOutput}' (Check base58Address).");
}
$decodeScript = (new OutputClassifier())->decode($recipient->getScriptPubKey());
if ($decodeScript->getType() != ScriptType::P2SH) {
throw new Exception("Invalid P2SH address in 'output#{$thisOutput}' (Check scriptPubKey).");
}
$spendTx = $spendTx->payToAddress($amount, $recipient);
}
$thisTx = $spendTx->get();
$signer = new Signer($thisTx, $ecAdapter);
foreach($signItems as $nIn=>$signItem) {
$privateKey = $privKeyFactory->fromHexCompressed($signItem[0]);
$scriptPubKey = ScriptFactory::fromHex($signItem[1]);
$txOutput = new TransactionOutput(0, $scriptPubKey );
$signer = $signer->sign($nIn, $privateKey, $txOutput);
}
?>
<div class="alert alert-success">
<h6 class="mt-3">Final TX Hex</h6>
<textarea class="form-control" rows="3" readonly><?php echo $signer->get()->getHex();?></textarea>
</div>
<?php
} catch (Exception $e) {
$errmsg .= "Problem found. " . $e->getMessage();
}
}
if ($errmsg) {
?>
<div class="alert alert-danger">
<strong>Error!</strong> <?php echo $errmsg?>
</div>
<?php
}
?>
<form action='' method='post'>
<div class="form-group">
<label for="network">Network: </label>
<select name="network" id="network" class="form-control">
<?php
$networks = get_class_methods(new NetworkFactory());
foreach($networks as $network) {
echo "<option value='{$network}'".($network == $_POST['network'] ? " selected": "").">{$network}</option>";
}
?>
</select>
</div>
<div class="row">
<div class="col-sm-6">
<div class="form-row">
<div class="form-group col">
<label for="no_of_inputs">Inputs: </label>
<select class="form-control" id="no_of_inputs" name='no_of_inputs' style='width:auto;' onchange="
var self = $(this);
var thisvalue = self.val();
var form = self.closest('form');
$('div[id^=row_input_]',form).hide();
for(var i=1; i<= thisvalue; i++) {
$('div[id=row_input_'+ i + ']',form).show();
}
">
<?php
foreach(range(1,$noOfInputs) as $thisInput) {
echo "<option value='{$thisInput}'".($thisInput == $_POST['no_of_inputs'] ? " selected": "").">{$thisInput}</option>";
}
?>
</select>
</div>
</div>
<?php
$selectedNInputs = is_numeric($_POST['no_of_inputs']) ? $_POST['no_of_inputs'] : 1;
foreach(range(1,$noOfInputs) as $thisInput) {
?>
<div class="form-row" id='row_input_<?php echo $thisInput?>' style="<?php echo ($thisInput > $selectedNInputs) ? "display:none" : "display:;"?>">
<div class="form-group col-sm-1">
#<?php echo $thisInput?>
</div>
<div class="form-group col-sm-3">
<input class="form-control" title="UTXO Tx Hash" placeholder='UTXO Tx Hash' type='text' name='utxo_hash_<?php echo $thisInput?>' value='<?php echo $_POST["utxo_hash_{$thisInput}"]?>'>
</div>
<div class="form-group col-sm-1">
<input class="form-control" title="UTXO N Output" placeholder='N' type='text' name='utxo_n_<?php echo $thisInput?>' value='<?php echo $_POST["utxo_n_{$thisInput}"]?>'>
</div>
<div class="form-group col-sm-3">
<input class="form-control" title="UTXO ScriptPubKey" placeholder='UTXO ScriptPubKey' type='text' name='utxo_script_<?php echo $thisInput?>' value='<?php echo $_POST["utxo_script_{$thisInput}"]?>'>
</div>
<div class="form-group col-sm-4">
<input class="form-control" title="Private Key Hex, for signing purpose." placeholder='Private Key Hex' type='text' name='privkey_<?php echo $thisInput?>' value='<?php echo $_POST["privkey_{$thisInput}"]?>'>
</div>
</div>
<?php
}
?>
</div>
<div class="col-sm-6">
<div class="form-row">
<div class="form-group col">
<label for="no_of_outputs">Outputs:</label> <select class="form-control" id="no_of_outputs" name='no_of_outputs' style='width:auto;' onchange="
var self = $(this);
var thisvalue = self.val();
var form = self.closest('form');
$('div[id^=row_output_]',form).hide();
for(var i=1; i<= thisvalue; i++) {
$('div[id=row_output_'+ i + ']',form).show();
}">
<?php
foreach(range(1,$noOfOutputs) as $thisOutput) {
echo "<option value='{$thisOutput}'".($thisOutput == $_POST['no_of_outputs'] ? " selected": "").">{$thisOutput}</option>";
}
?>
</select>
</div>
</div>
<?php
$selectedNOutputs = is_numeric($_POST['no_of_outputs']) ? $_POST['no_of_outputs'] : 1;
foreach(range(1,$noOfOutputs) as $thisOutput) {
?>
<div class="form-row" id='row_output_<?php echo $thisOutput?>' style="<?php echo ($thisOutput > $selectedNOutputs) ? "display:none" : "display:;"?>">
<div class="form-group col-sm-1">
#<?php echo $thisOutput?>
</div>
<div class="form-group col-sm-6">
<input class="form-control" placeholder='P2SH Address' type='text' name='address_<?php echo $thisOutput?>' value='<?php echo $_POST["address_{$thisOutput}"]?>'>
</div>
<div class="form-group col-sm-5">
<input class="form-control" placeholder='Amount' type='text' name='amount_<?php echo $thisOutput?>' value='<?php echo $_POST["amount_{$thisOutput}"]?>'>
</div>
</div>
<?php
}
?>
</div>
</div>
<input type='submit' class="btn btn-success btn-block"/>
</form>
<?php
include_once("html_iframe_footer.php");
<?php
use BitWasp\Bitcoin\Bitcoin;
use BitWasp\Buffertools\Buffer;
use BitWasp\Bitcoin\Network\NetworkFactory;
use BitWasp\Bitcoin\Address\AddressCreator;
use BitWasp\Bitcoin\Transaction\TransactionFactory;
use BitWasp\Bitcoin\Script\Classifier\OutputClassifier;
use BitWasp\Bitcoin\Script\ScriptType;
use BitWasp\Bitcoin\Script\Script;
include_once "../libraries/vendor/autoload.php";
$noOfInputs = 10;
$noOfOutputs = 1;
if ($_SERVER['REQUEST_METHOD'] == 'GET' AND $_GET['ajax'] == '1') {
$data = [];
if (!ctype_xdigit($_GET['utx'])) {
$data = ["error"=>"UTX must be hex."];
} else {
$utxHex = $_GET['utx'];
$utx = TransactionFactory::fromHex($utxHex);
$outputs = $utx->getOutputs();
$data['txHash'] = $utx->getTxHash()->flip()->getHex();//swap endianess
$data['outputs'] = [];
if (@count($outputs)) {
foreach($outputs as $k=>$output) {
if ($k < 10) { //limit to retrieve max 10 inputs only
$decodeScript = (new OutputClassifier())->decode($output->getScript());
if ($decodeScript->getType() != ScriptType::P2SH) {
$data = ["error"=>"Load fail! Your unspent transaction output (utxo) can only contain P2SH ScriptPubKey."];
break;
}
$data['outputs'][] = ["amount"=>$output->getValue(), "n"=>$k, "scriptPubKey"=>$output->getScript()->getHex()];
}
}
}
}
die(json_encode($data));
}
include_once("html_iframe_header.php");
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
try {
$networkClass = $_POST['network'];
Bitcoin::setNetwork(NetworkFactory::$networkClass());
$network = Bitcoin::getNetwork();
$ecAdapter = Bitcoin::getEcAdapter();
$addrCreator = new AddressCreator();
$spendTx = TransactionFactory::build();
$signItems = [];
if (!strlen($_POST['utx']) or !ctype_xdigit($_POST['utx'])) {
throw new Exception("UTX must be hex.");
}
if (!is_numeric($_POST['no_of_inputs']) OR !is_numeric($_POST['no_of_outputs'])) {
throw new Exception("Error in 'no_of_inputs' or 'no_of_outputs'.");
}
$utxHex = $_POST['utx'];
$utx = TransactionFactory::fromHex($utxHex);
$utxos = $utx->getOutputs();
foreach($utxos as $k=>$utxo) {
$scriptSig = trim($_POST["script_sig_" . ($k+1)]);
$scriptSig = new Script(Buffer::hex($scriptSig));
$spendTx = $spendTx->spendOutputFrom($utx, $k, $scriptSig);
}
foreach(range(1,$_POST['no_of_outputs']) as $thisOutput) {
$address = trim($_POST["address_{$thisOutput}"]);
$amount = trim($_POST["amount_{$thisOutput}"]);
if (strlen($address)>0 AND strlen($amount)>0) {
$recipient = $addrCreator->fromString($address);
$spendTx = $spendTx->payToAddress($amount, $recipient);
} else {
throw new Exception("Error in 'output#{$thisOutput}'.");
}
}
?>
<div class="alert alert-success">
<h6 class="mt-3">Final TX Hex</h6>
<textarea class="form-control" rows="3" readonly><?php echo $spendTx->get()->getHex();?></textarea>
</div>
<?php
} catch (Exception $e) {
$errmsg .= "Problem found. " . $e->getMessage();
}
}
if ($errmsg) {
?>
<div class="alert alert-danger">
<strong>Error!</strong> <?php echo $errmsg?>
</div>
<?php
}
?>
<form action='' method='post'>
<div class="form-group">
<label for="network">Network: </label>
<select name="network" id="network" class="form-control">
<?php
$networks = get_class_methods(new NetworkFactory());
foreach($networks as $network) {
echo "<option value='{$network}'".($network == $_POST['network'] ? " selected": "").">{$network}</option>";
}
?>
</select>
</div>
<div class="form-group">
<label for="utx">Unspent Transaction (Hex):</label>
<div class="input-group mb-3">
<input class="form-control" type='text' name='utx' id='utx' value='<?php echo $_POST['utx']?>'>
<div class="input-group-append">
<input class="btn btn-success" type="button" id="form2_tabitem3_load" value="Load" onclick="
var self = $(this);
self.val('......');
var form = self.closest('form');
var allInputDivs = form.find('div[id^=row_input_]');
var allInputs = $( ':input',allInputDivs );
allInputs.val('');
allInputDivs.hide();
$('select#no_of_inputs',form).empty();
$('span#total_inputs',form).html('0');
$.ajax({
url: '?ajax=1&tab=form2_tabitem3&utx=' + $('input#utx',form).val(),
success:function(result){
try {
j = eval('(' + result + ')');
if ('error' in j && j.error.length>0) {
var error = true;
} else {
var error = false;
}
if (!error) {
var txHash = j.txHash;
var outputs = j.outputs;
var totalInputs = 0;
if (outputs.length > 0) {
$('select#no_of_inputs',form).prepend('<option value=\''+outputs.length+'\' selected=\'selected\'>'+outputs.length+'</option>');
var x;
for (x in outputs) {
var divid = parseInt(x) + 1;
var amount = parseInt(outputs[x].amount);
totalInputs += amount;
$('div#row_input_' + divid ,form).show();
$('input[name=utxo_hash_' + divid+']' ,form).val(txHash);
$('input[name=utxo_n_' + divid+']' ,form).val(outputs[x].n);
$('input[name=utxo_script_' + divid+']',form).val(outputs[x].scriptPubKey);
$('input[name=utxo_amount_' + divid+']',form).val(amount);
$('input[name=privkey_'+divid+']' ,form).removeAttr('readonly');
}
}
$('span#total_inputs',form).html(totalInputs);
} else {
alert(j.error);
}
} catch(e) {
alert('Invalid Json Format.');
}
},
complete:function() {
self.val('Load');
}
});"/>
</div>
</div>
<!--* This sample will extract UTX Outputs from provided UTX Hex-->
</div>
<div class="row">
<div class="col-sm-6">
<div class="form-row">
<div class="form-group col">
<label for="no_of_inputs">Inputs: <i>Max 10 inputs only. Please load them from UTX above.</i></label>
<div class="row">
<div class="col-sm-2">
<select class="form-control" id="no_of_inputs" name='no_of_inputs' style='width:auto;' onchange="
var self = $(this);
var thisvalue = self.val();
var form = self.closest('form');
$('div[id^=row_input_]',form).hide();
for(var i=1; i<= thisvalue; i++) {
$('div[id=row_input_'+ i + ']',form).show();
}
" readonly>
<?php
$optionval = $_POST['no_of_inputs']?$_POST['no_of_inputs'] : 0;
if ($optionval > 0) {
?>
<option value='<?php echo $optionval?>'><?php echo $optionval?></option>
<?php
}
?>
</select>
</div>
<div class="col-sm-10">
Total Sathoshi:
<span id='total_inputs'>
<?php echo
array_reduce(
array_keys($_POST),
function($carry, $key) {
if (preg_match('/^utxo_amount_/', $key)) {
return $carry + (int)$_POST[$key];
} else {
return $carry;
}
}, 0
);?>
</span>
</div>
</div>
</div>
</div>
<?php
$selectedNInputs = is_numeric($_POST['no_of_inputs']) ? $_POST['no_of_inputs'] : 0;
foreach(range(1,$noOfInputs) as $thisInput) {
?>
<div class="form-row" id='row_input_<?php echo $thisInput?>' style="<?php echo ($thisInput > $selectedNInputs) ? "display:none" : "display:;"?>">
<input type='hidden' name='utxo_amount_<?php echo $thisInput?>' value='<?php echo $_POST["utxo_amount_{$thisInput}"]?>'/>
<div class="form-group col-sm-1">
#<?php echo $thisInput?>
</div>
<div class="form-group col-sm-3">
<input class="form-control" title="UTXO Tx Hash" placeholder='UTXO Tx Hash' type='text' name='utxo_hash_<?php echo $thisInput?>' value='<?php echo $_POST["utxo_hash_{$thisInput}"]?>' readonly>
</div>
<div class="form-group col-sm-1">
<input class="form-control" title="UTXO N Output" placeholder='N' type='text' name='utxo_n_<?php echo $thisInput?>' value='<?php echo $_POST["utxo_n_{$thisInput}"]?>' readonly>
</div>
<div class="form-group col-sm-3">
<input class="form-control" title="UTXO ScriptPubKey" placeholder='UTXO ScriptPubKey' type='text' name='utxo_script_<?php echo $thisInput?>' value='<?php echo $_POST["utxo_script_{$thisInput}"]?>' readonly>
</div>
<div class="form-group col-sm-4">
<input class="form-control" title="Input signature to unlock UTXO." placeholder='ScriptSig' type='text' name='script_sig_<?php echo $thisInput?>' value='<?php echo $_POST["script_sig_{$thisInput}"]?>'>
</div>
</div>
<?php
}
?>
</div>
<div class="col-sm-6">
<div class="form-row">
<div class="form-group col">
<label for="no_of_outputs">Outputs:</label> <select class="form-control" id="no_of_outputs" name='no_of_outputs' style='width:auto;' onchange="
var self = $(this);
var thisvalue = self.val();
var form = self.closest('form');
$('div[id^=row_output_]',form).hide();
for(var i=1; i<= thisvalue; i++) {
$('div[id=row_output_'+ i + ']',form).show();
}">
<?php
foreach(range(1,$noOfOutputs) as $thisOutput) {
echo "<option value='{$thisOutput}'".($thisOutput == $_POST['no_of_outputs'] ? " selected": "").">{$thisOutput}</option>";
}
?>
</select>
</div>
</div>
<?php
$selectedNOutputs = is_numeric($_POST['no_of_outputs']) ? $_POST['no_of_outputs'] : 1;
foreach(range(1,$noOfOutputs) as $thisOutput) {
?>
<div class="form-row" id='row_output_<?php echo $thisOutput?>' style="<?php echo ($thisOutput > $selectedNOutputs) ? "display:none" : "display:;"?>">
<div class="form-group col-sm-1">
#<?php echo $thisOutput?>
</div>
<div class="form-group col-sm-6">
<input class="form-control" placeholder='Any Address' type='text' name='address_<?php echo $thisOutput?>' value='<?php echo $_POST["address_{$thisOutput}"]?>'>
</div>
<div class="form-group col-sm-5">
<input class="form-control" placeholder='Amount' type='text' name='amount_<?php echo $thisOutput?>' value='<?php echo $_POST["amount_{$thisOutput}"]?>'>
</div>
</div>
<?php
}
?>
</div>
</div>
<input type='submit' class="btn btn-success btn-block"/>
</form>
<small>
Please be minded that for ease of learning. We have put a little restriction to both inputs and outputs. In reality, inputs and outputs in bitcoin & its derived coins support many of different tx type.
</small>
<?php
include_once("html_iframe_footer.php");