diff --git a/index.html b/index.html
index a5c5fa4..c9f6d77 100644
--- a/index.html
+++ b/index.html
@@ -1382,13 +1382,7 @@
Network:
Select which network you'd like to use for key pair generation.
diff --git a/js/coin.js b/js/coin.js
index 84a1149..f75f7f7 100644
--- a/js/coin.js
+++ b/js/coin.js
@@ -10,11 +10,11 @@
var coinjs = window.coinjs = function () { };
/* public vars */
- coinjs.pub = 0x00;
- coinjs.priv = 0x80;
- coinjs.multisig = 0x05;
+ coinjs.pub = 0x55;
+ coinjs.priv = 0x1c;
+ coinjs.multisig = 0x7a;
coinjs.hdkey = {'prv':0x0488ade4, 'pub':0x0488b21e};
- coinjs.bech32 = {'charset':'qpzry9x8gf2tvdw0s3jn54khce6mua7l', 'version':0, 'hrp':'bc'};
+ coinjs.bech32 = {'charset':'qpzry9x8gf2tvdw0s3jn54khce6mua7l', 'version':0, 'hrp':'lbc'};
coinjs.compressed = false;
@@ -22,10 +22,13 @@
coinjs.developer = '33tht1bKDgZVxb39MnZsWa8oxHXHvUYE4G'; //bitcoin
/* bit(coinb.in) api vars */
- coinjs.hostname = ((document.location.hostname.split(".")[(document.location.hostname.split(".")).length-1]) == 'onion') ? 'coinbin3ravkwb24f7rmxx6w3snkjw45jhs5lxbh3yfeg3vpt6janwqd.onion' : 'coinb.in';
+// coinjs.hostname = ((document.location.hostname.split(".")[(document.location.hostname.split(".")).length-1]) == 'onion') ? 'coinbin3ravkwb24f7rmxx6w3snkjw45jhs5lxbh3yfeg3vpt6janwqd.onion' : 'coinb.in';
+ coinjs.hostname = 'localhost:8000';
coinjs.host = ('https:'==document.location.protocol?'https://':'http://')+coinjs.hostname+'/api/';
coinjs.uid = '1';
coinjs.key = '12345678901234567890123456789012';
+ coinjs.chainqueryAPI = "https://chainquery.lbry.com/api/sql"
+
/* start of address functions */
@@ -177,6 +180,37 @@
return {'address':address, 'redeemScript':redeemScript};
}
+ coinjs.timelockedAddress = function(pubkey, checklocktimeverify) {
+
+ if(checklocktimeverify < 0) {
+ throw "Parameter for OP_CHECKLOCKTIMEVERIFY is negative.";
+ }
+
+ var s = coinjs.script();
+ if (checklocktimeverify <= 16 && checklocktimeverify >= 1) {
+ s.writeOp(0x50 + checklocktimeverify);//OP_1 to OP_16 for minimal encoding
+ } else {
+ s.writeBytes(coinjs.numToScriptNumBytes(checklocktimeverify));
+ }
+ s.writeOp(0xb1);//OP_CHECKLOCKTIMEVERIFY
+ s.writeOp(0x75);//OP_DROP
+ s.writeOp(0x76);//OP_DUP
+ s.writeOp(0xa9);//OP_HASH160
+ s.writeBytes(Crypto.util.hexToBytes(pubkey));
+ s.writeOp(0x88);//88 OP_EQUALVERIFY
+ s.writeOp(0xac);//OP_CHECKSIG
+
+ var x = ripemd160(Crypto.SHA256(s.buffer, {asBytes: true}), {asBytes: true});
+ x.unshift(coinjs.multisig);
+ var r = x;
+ r = Crypto.SHA256(Crypto.SHA256(r, {asBytes: true}), {asBytes: true});
+ var checksum = r.slice(0,4);
+ var redeemScript = Crypto.util.bytesToHex(s.buffer);
+ var address = coinjs.base58encode(x.concat(checksum));
+
+ return {'address':address, 'redeemScript':redeemScript};
+ }
+
/* create a new segwit address */
coinjs.segwitAddress = function(pubkey){
var keyhash = [0x00,0x14].concat(ripemd160(Crypto.SHA256(Crypto.util.hexToBytes(pubkey), {asBytes: true}), {asBytes: true}));
@@ -321,7 +355,8 @@
/* retreive the balance from a given address */
coinjs.addressBalance = function(address, callback){
- coinjs.ajax(coinjs.host+'?uid='+coinjs.uid+'&key='+coinjs.key+'&setmodule=addresses&request=bal&address='+address+'&r='+Math.random(), callback, "GET");
+ const query = 'select balance from address where address = "'+address+'";'
+ coinjs.ajax(coinjs.chainqueryAPI+'?query='+encodeURIComponent(query), (response)=>{callback(JSON.parse(response))}, "GET");
}
/* decompress an compressed public key */
@@ -899,6 +934,16 @@
var rs = Crypto.util.bytesToHex(s.buffer);
r.redeemscript = rs;
r.type = "hodl__";
+
+ } else if(s.chunks.length == 8 && s.chunks[1] == 177 && s.chunks[2] == 117 && s.chunks[3] == 118 && s.chunks[7] == 172){
+ // ^ OP_CHECKLOCKTIMEVERIFY OP_DROP OP_DUP OP_HASH160 OP_EQUALVERIFY OP_CHECKSIG ^
+ r = {}
+ r.pubkey = Crypto.util.bytesToHex(s.chunks[5]);
+ r.checklocktimeverify = coinjs.bytesToNum(s.chunks[0].slice());
+ r.address = coinjs.timelockedAddress(r.pubkey, r.checklocktimeverify).address;
+ var rs = Crypto.util.bytesToHex(s.buffer);
+ r.redeemscript = rs;
+ r.type = "hodl__";
}
} catch(e) {
// console.log(e);
@@ -1064,12 +1109,14 @@
/* list unspent transactions */
r.listUnspent = function(address, callback) {
- coinjs.ajax(coinjs.host+'?uid='+coinjs.uid+'&key='+coinjs.key+'&setmodule=addresses&request=unspent&address='+address+'&r='+Math.random(), callback, "GET");
+ const query = 'select o.transaction_hash, o.vout, o.value, o.script_pub_key_hex, o.type from address a inner join transaction_address ta on a.id = ta.address_id inner join output o on o.transaction_id = ta.transaction_id and o.is_spent = 0 and o.type not in ("nonstandard","nulldata") and o.address_list = \'["'+address+'"]\' where a.address = "'+address+'";'
+ coinjs.ajax(coinjs.chainqueryAPI+'?query='+encodeURIComponent(query), (response)=>{callback(JSON.parse(response))}, "GET");
}
/* list transaction data */
r.getTransaction = function(txid, callback) {
- coinjs.ajax(coinjs.host+'?uid='+coinjs.uid+'&key='+coinjs.key+'&setmodule=bitcoin&request=gettransaction&txid='+txid+'&r='+Math.random(), callback, "GET");
+ const query = 'select transaction_hash, vout, value, script_pub_key_hex from output where is_spent = 0 and type not in ("nonstandard","nulldata") and transaction_hash = "'+txid+'"'
+ coinjs.ajax(coinjs.chainqueryAPI+'?query='+encodeURIComponent(query), (response)=>{callback(JSON.parse(response))}, "GET");
}
/* add unspent to transaction */
@@ -1081,23 +1128,12 @@
var total = 0;
var x = {};
- if (window.DOMParser) {
- parser=new DOMParser();
- xmlDoc=parser.parseFromString(data,"text/xml");
- } else {
- xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
- xmlDoc.async=false;
- xmlDoc.loadXML(data);
- }
-
- var unspent = xmlDoc.getElementsByTagName("unspent")[0];
-
- if(unspent){
- for(i=1;i<=unspent.childElementCount;i++){
- var u = xmlDoc.getElementsByTagName("unspent_"+i)[0]
- var txhash = (u.getElementsByTagName("tx_hash")[0].childNodes[0].nodeValue).match(/.{1,2}/g).reverse().join("")+'';
- var n = u.getElementsByTagName("tx_output_n")[0].childNodes[0].nodeValue;
- var scr = script || u.getElementsByTagName("script")[0].childNodes[0].nodeValue;
+ if(data){
+ for(i=0;i<=data["data"].length;i++){
+ var u = data["data"][i]
+ var txhash = u["transaction_hash"];
+ var n = u["vout"];
+ var scr = script || n["script_pub_key_hex"];
if(segwit){
/* this is a small hack to include the value with the redeemscript to make the signing procedure smoother.
@@ -1106,22 +1142,19 @@
s = coinjs.script();
s.writeBytes(Crypto.util.hexToBytes(script));
s.writeOp(0);
- s.writeBytes(coinjs.numToBytes(u.getElementsByTagName("value")[0].childNodes[0].nodeValue*1, 8));
+ s.writeBytes(coinjs.numToBytes(u["value"]));
scr = Crypto.util.bytesToHex(s.buffer);
}
var seq = sequence || false;
self.addinput(txhash, n, scr, seq);
- value += u.getElementsByTagName("value")[0].childNodes[0].nodeValue*1;
+ value += u["value"];
total++;
}
}
- x.result = xmlDoc.getElementsByTagName("result")[0].childNodes[0].nodeValue;
- x.unspent = unspent;
x.value = value;
x.total = total;
- x.response = xmlDoc.getElementsByTagName("response")[0].childNodes[0].nodeValue;
return callback(x);
});
diff --git a/js/coinbin.js b/js/coinbin.js
index 393b63f..4f14184 100644
--- a/js/coinbin.js
+++ b/js/coinbin.js
@@ -2,9 +2,9 @@ $(document).ready(function() {
/* open wallet code */
- var explorer_tx = "https://coinb.in/tx/"
- var explorer_addr = "https://coinb.in/addr/"
- var explorer_block = "https://coinb.in/block/"
+ var explorer_tx = "https://explorer.lbry.com/tx/"
+ var explorer_addr = "https://explorer.lbry.com/address/"
+ var explorer_block = "https://explorer.lbry.com/blocks/"
var wallet_timer = false;
@@ -202,7 +202,7 @@ $(document).ready(function() {
tx2.broadcast(function(data){
if($(data).find("result").text()=="1"){
- $("#walletSendConfirmStatus").removeClass('hidden').addClass('alert-success').html('txid: '+$(data).find("txid").text()+'');
+ $("#walletSendConfirmStatus").removeClass('hidden').addClass('alert-success').html('txid: '+$(data).find("txid").text()+'');
} else {
$("#walletSendConfirmStatus").removeClass('hidden').addClass('alert-danger').html(unescape($(data).find("response").text()).replace(/\+/g,' '));
$("#walletSendFailTransaction").removeClass('hidden');
@@ -302,14 +302,13 @@ $(document).ready(function() {
function walletBalance(){
if($("#walletLoader").hasClass("hidden")){
- var tx = coinjs.transaction();
$("#walletLoader").removeClass("hidden");
coinjs.addressBalance($("#walletAddress").html(),function(data){
- if($(data).find("result").text()==1){
- var v = $(data).find("balance").text()/100000000;
- $("#walletBalance").html(v+" BTC").attr('rel',v).fadeOut().fadeIn();
+ if(data["success"]){
+ const v = data["data"][0]["balance"];
+ $("#walletBalance").html(v+" LBC").attr('rel',v).fadeOut().fadeIn();
} else {
- $("#walletBalance").html("0.00 BTC").attr('rel',v).fadeOut().fadeIn();
+ $("#walletBalance").html("0.00 LBC").attr('rel',0).fadeOut().fadeIn();
}
$("#walletLoader").addClass("hidden");
@@ -908,34 +907,7 @@ $(document).ready(function() {
var host = $(this).attr('rel');
- // api: blockcypher blockchair chain.so
- // network name "btc" "bitcoin" "BTC"
- // network name "ltc" "litecoin" "LTC"
- // network name "doge" "dogecoin" "DOGE"
-
- if(host=='chain.so_bitcoinmainnet'){
- listUnspentChainso(redeem, "BTC");
- } else if(host=='chain.so_litecoin'){
- listUnspentChainso(redeem, "LTC");
- } else if(host=='chain.so_dogecoin'){
- listUnspentChainso(redeem, "DOGE");
-
- } else if(host=='blockcypher_bitcoinmainnet'){
- listUnspentBlockcypher(redeem, "btc");
- } else if(host=='blockcypher_litecoin'){
- listUnspentBlockcypher(redeem, "ltc");
- } else if(host=='blockcypher_dogecoin'){
- listUnspentBlockcypher(redeem, "doge");
-
- } else if(host=='blockchair_bitcoinmainnet'){
- listUnspentBlockchair(redeem, "bitcoin");
- } else if(host=='blockchair_litecoin'){
- listUnspentBlockchair(redeem, "litecoin");
- } else if(host=='blockchair_dogecoin'){
- listUnspentBlockchair(redeem, "dogecoin");
- } else {
- listUnspentDefault(redeem);
- }
+ listUnspentDefault(redeem);
if($("#redeemFromStatus").hasClass("hidden")) {
// An ethical dilemma: Should we automatically set nLockTime?
@@ -1001,28 +973,30 @@ $(document).ready(function() {
$('#recipients .row[rel="'+redeem.addr+'"]').parent().remove();
- $.each(redeem.decodedRs.pubkeys, function(i, o){
- $.each($("#mediatorList option"), function(mi, mo){
+ if (redeem.decodedRs.pubkeys) {
+ $.each(redeem.decodedRs.pubkeys, function(i, o){
+ $.each($("#mediatorList option"), function(mi, mo){
- var ms = ($(mo).val()).split(";");
+ var ms = ($(mo).val()).split(";");
- var pubkey = ms[0]; // mediators pubkey
- var fee = ms[2]*1; // fee in a percentage
- var payto = coinjs.pubkey2address(pubkey); // pay to mediators address
+ var pubkey = ms[0]; // mediators pubkey
+ var fee = ms[2]*1; // fee in a percentage
+ var payto = coinjs.pubkey2address(pubkey); // pay to mediators address
- if(o==pubkey){ // matched a mediators pubkey?
+ if(o==pubkey){ // matched a mediators pubkey?
- var clone = ''+$("#recipients .addressAddTo").parent().parent().html()+'
';
- $("#recipients").prepend(clone);
+ var clone = ''+$("#recipients .addressAddTo").parent().parent().html()+'
';
+ $("#recipients").prepend(clone);
- $("#recipients .mediator_"+pubkey+" .glyphicon-plus:first").removeClass('glyphicon-plus');
- $("#recipients .mediator_"+pubkey+" .address:first").val(payto).attr('disabled', true).attr('readonly',true).attr('title','Medation fee for '+$(mo).html());
+ $("#recipients .mediator_"+pubkey+" .glyphicon-plus:first").removeClass('glyphicon-plus');
+ $("#recipients .mediator_"+pubkey+" .address:first").val(payto).attr('disabled', true).attr('readonly',true).attr('title','Medation fee for '+$(mo).html());
- var amount = ((fee*$("#totalInput").html())/100).toFixed(8);
- $("#recipients .mediator_"+pubkey+" .amount:first").attr('disabled',(((amount*1)==0)?false:true)).val(amount).attr('title','Medation fee for '+$(mo).html());
- }
+ var amount = ((fee*$("#totalInput").html())/100).toFixed(8);
+ $("#recipients .mediator_"+pubkey+" .amount:first").attr('disabled',(((amount*1)==0)?false:true)).val(amount).attr('title','Medation fee for '+$(mo).html());
+ }
+ });
});
- });
+ }
validateOutputAmount();
}
@@ -1075,18 +1049,21 @@ $(document).ready(function() {
if(redeem.from == 'txid'){
tx.getTransaction(redeem.addr, function(data){
+ if (data["error"]) {
+ $("#redeemFromStatus").removeClass('hidden').html(' Unexpected error, unable to retrieve unspent outputs. '+data["error"]);
+ $("#redeemFromBtn").html("Load").attr('disabled',false);
+ return;
+ }
$("#redeemFromAddress").removeClass('hidden').html(' Attempted to rebuild transaction id '+redeem.addr+'');
- $.each($(data).find("inputs").children(), function(i,o){
- var tx = $(o).find("txid").text();
- var n = $(o).find("output_no").text();
- var amount = (($(o).find("value").text()*1)).toFixed(8);
-
- var scr = $(o).find("script").text();
-
- addOutput(tx, n, scr, amount);
+ $.each(data["data"], function(i,o){
+ var tx = o["transaction_hash"];
+ var n = o["vout"];
+ var script = (redeem.redeemscript==true) ? redeem.decodedRs : o["script_pub_key_hex"];
+ var amount = o["value"];
+ addOutput(tx, n, script, amount);
});
$("#recipients .addressRemoveTo").click();
@@ -1109,14 +1086,20 @@ $(document).ready(function() {
// unspent from address
tx.listUnspent(redeem.addr, function(data){
+ if (data["error"]) {
+ $("#redeemFromStatus").removeClass('hidden').html(' Unexpected error, unable to retrieve unspent outputs. '+data["error"]);
+ $("#redeemFromBtn").html("Load").attr('disabled',false);
+ return;
+ }
+
if(redeem.addr) {
$("#redeemFromAddress").removeClass('hidden').html(' Retrieved unspent inputs from address '+redeem.addr+'');
- $.each($(data).find("unspent").children(), function(i,o){
- var tx = $(o).find("tx_hash").text();
- var n = $(o).find("tx_output_n").text();
- var script = (redeem.redeemscript==true) ? redeem.decodedRs : $(o).find("script").text();
- var amount = (($(o).find("value").text()*1)/100000000).toFixed(8);
+ $.each(data["data"], function(i,o){
+ var tx = o["transaction_hash"];
+ var n = o["vout"];
+ var script = (redeem.redeemscript==true) ? redeem.decodedRs : o["script_pub_key_hex"];
+ var amount = o["value"];
addOutput(tx, n, script, amount);
});
@@ -1130,107 +1113,6 @@ $(document).ready(function() {
}
- /* retrieve unspent data from blockcypher */
- function listUnspentBlockcypher(redeem,network){
- $.ajax ({
- type: "GET",
- url: "https://api.blockcypher.com/v1/"+network+"/main/addrs/"+redeem.addr+"?includeScript=true&unspentOnly=true",
- dataType: "json",
- error: function(data) {
- $("#redeemFromStatus").removeClass('hidden').html(' Unexpected error, unable to retrieve unspent outputs!');
- },
- success: function(data) {
- if (data.address) { // address field will always be present, txrefs is only present if there are UTXOs
- $("#redeemFromAddress").removeClass('hidden').html(' Retrieved unspent inputs from address '+redeem.addr+'');
- for(var i in data.txrefs){
- var o = data.txrefs[i];
- var tx = ((""+o.tx_hash).match(/.{1,2}/g).reverse()).join("")+'';
- if(tx.match(/^[a-f0-9]+$/)){
- var n = o.tx_output_n;
- var script = (redeem.redeemscript==true) ? redeem.decodedRs : o.script;
- var amount = ((o.value.toString()*1)/100000000).toFixed(8);
- addOutput(tx, n, script, amount);
- }
- }
- } else {
- $("#redeemFromStatus").removeClass('hidden').html(' Unexpected error, unable to retrieve unspent outputs.');
- }
- },
- complete: function(data, status) {
- $("#redeemFromBtn").html("Load").attr('disabled',false);
- totalInputAmount();
- }
- });
- }
-
- /* retrieve unspent data from blockchair */
- function listUnspentBlockchair(redeem,network){
- $.ajax ({
- type: "GET",
- url: "https://api.blockchair.com/"+network+"/dashboards/address/"+redeem.addr,
- dataType: "json",
- error: function(data) {
- $("#redeemFromStatus").removeClass('hidden').html(' Unexpected error, unable to retrieve unspent outputs!');
- },
- success: function(data) {
- if((data.context && data.data) && data.context.code =='200'){
- $("#redeemFromAddress").removeClass('hidden').html(' Retrieved unspent inputs from address '+redeem.addr+'');
- var all_info = data.data[redeem.addr];
- for(var i in all_info.utxo){
- var o = all_info.utxo[i];
- var tx = ((""+o.transaction_hash).match(/.{1,2}/g).reverse()).join("")+'';
- if(tx.match(/^[a-f0-9]+$/)){
- var n = o.index;
- var script = (redeem.redeemscript==true) ? redeem.decodedRs : all_info.address.script_hex;
- var amount = ((o.value.toString()*1)/100000000).toFixed(8);
- addOutput(tx, n, script, amount);
- }
- }
- } else {
- $("#redeemFromStatus").removeClass('hidden').html(' Unexpected error, unable to retrieve unspent outputs.');
- }
- },
- complete: function(data, status) {
- $("#redeemFromBtn").html("Load").attr('disabled',false);
- totalInputAmount();
- }
- });
- }
-
-
- /* retrieve unspent data from chainso */
- function listUnspentChainso(redeem, network){
- $.ajax ({
- type: "GET",
- url: "https://chain.so/api/v2/get_tx_unspent/"+network+"/"+redeem.addr,
- dataType: "json",
- error: function(data) {
- $("#redeemFromStatus").removeClass('hidden').html(' Unexpected error, unable to retrieve unspent outputs!');
- },
- success: function(data) {
- if((data.status && data.data) && data.status=='success'){
- $("#redeemFromAddress").removeClass('hidden').html(' Retrieved unspent inputs from address '+redeem.addr+'');
- for(var i in data.data.txs){
- var o = data.data.txs[i];
- var tx = ((""+o.txid).match(/.{1,2}/g).reverse()).join("")+'';
- if(tx.match(/^[a-f0-9]+$/)){
- var n = o.output_no;
- var script = (redeem.redeemscript==true) ? redeem.decodedRs : o.script_hex;
- var amount = o.value;
- addOutput(tx, n, script, amount);
- }
- }
- } else {
- $("#redeemFromStatus").removeClass('hidden').html(' Unexpected error, unable to retrieve unspent outputs.');
- }
- },
- complete: function(data, status) {
- $("#redeemFromBtn").html("Load").attr('disabled',false);
- totalInputAmount();
- }
- });
- }
-
/* math to calculate the inputs and outputs */
@@ -1303,7 +1185,7 @@ $(document).ready(function() {
error: function(data) {
$("#rawTransactionStatus").addClass('alert-danger').removeClass('alert-success').removeClass("hidden").html(" There was an error submitting your request, please try again").prepend('');
},
- success: function(data) {
+ success: function(data) {
$("#rawTransactionStatus").html(unescape($(data).find("response").text()).replace(/\+/g,' ')).removeClass('hidden');
if($(data).find("result").text()==1){
$("#rawTransactionStatus").addClass('alert-success').removeClass('alert-danger').removeClass("hidden").html(' TXID: ' + $(data).find("txid").text() + '
View on Blockchain');
@@ -1318,89 +1200,6 @@ $(document).ready(function() {
});
}
- // broadcast transaction via chain.so (mainnet)
- function rawSubmitChainso(thisbtn, network){
- $(thisbtn).val('Please wait, loading...').attr('disabled',true);
- $.ajax ({
- type: "POST",
- url: "https://chain.so/api/v2/send_tx/"+network+"/",
- data: {"tx_hex":$("#rawTransaction").val()},
- dataType: "json",
- error: function(data) {
- var obj = $.parseJSON(data.responseText);
- var r = ' ';
- r += (obj.data.tx_hex) ? obj.data.tx_hex : '';
- r = (r!='') ? r : ' Failed to broadcast'; // build response
- $("#rawTransactionStatus").addClass('alert-danger').removeClass('alert-success').removeClass("hidden").html(r).prepend('');
- },
- success: function(data) {
- if(data.status && data.data.txid){
- $("#rawTransactionStatus").addClass('alert-success').removeClass('alert-danger').removeClass("hidden").html(' TXID: ' + data.data.txid + '
View on Blockchain Explorer');
- } else {
- $("#rawTransactionStatus").addClass('alert-danger').removeClass('alert-success').removeClass("hidden").html(' Unexpected error, please try again').prepend('');
- }
- },
- complete: function(data, status) {
- $("#rawTransactionStatus").fadeOut().fadeIn();
- $(thisbtn).val('Submit').attr('disabled',false);
- }
- });
- }
-
- // broadcast transaction via blockcypher.com (mainnet)
- function rawSubmitblockcypher(thisbtn, network){
- $(thisbtn).val('Please wait, loading...').attr('disabled',true);
- $.ajax ({
- type: "POST",
- url: "https://api.blockcypher.com/v1/"+network+"/main/txs/push",
- data: JSON.stringify({"tx":$("#rawTransaction").val()}),
- error: function(data) {
- var r = 'Failed to broadcast: error code=' + data.status.toString() + ' ' + data.statusText;
- $("#rawTransactionStatus").addClass('alert-danger').removeClass('alert-success').removeClass("hidden").html(r).prepend('');
- },
- success: function(data) {
- if((data.tx) && data.tx.hash){
- $("#rawTransactionStatus").addClass('alert-success').removeClass('alert-danger').removeClass("hidden")
- .html(' TXID: ' + data.tx.hash + '
View on Blockchain Explorer');
- } else {
- $("#rawTransactionStatus").addClass('alert-danger').removeClass('alert-success').removeClass("hidden").html(' Unexpected error, please try again').prepend('');
- }
- },
- complete: function(data, status) {
- $("#rawTransactionStatus").fadeOut().fadeIn();
- $(thisbtn).val('Submit').attr('disabled',false);
- }
- });
- }
-
- // broadcast transaction via blockchair
- function rawSubmitblockchair(thisbtn, network){
- $(thisbtn).val('Please wait, loading...').attr('disabled',true);
- $.ajax ({
- type: "POST",
- url: "https://api.blockchair.com/"+network+"/push/transaction",
- data: {"data":$("#rawTransaction").val()},
- dataType: "json",
- error: function(data) {
- var r = 'Failed to broadcast: error code=' + data.status.toString() + ' ' + data.statusText;
- $("#rawTransactionStatus").addClass('alert-danger').removeClass('alert-success').removeClass("hidden").html(r).prepend('');
- // console.error(JSON.stringify(data, null, 4));
- },
- success: function(data) {
- // console.info(JSON.stringify(data, null, 4));
- if((data.context && data.data) && data.context.code=='200'){
- $("#rawTransactionStatus").addClass('alert-success').removeClass('alert-danger').removeClass("hidden")
- .html(' TXID: ' + data.data.transaction_hash + '
View on Blockchain Explorer');
- } else {
- $("#rawTransactionStatus").addClass('alert-danger').removeClass('alert-success').removeClass("hidden").html(' Unexpected error, please try again').prepend('');
- }
- },
- complete: function(data, status) {
- $("#rawTransactionStatus").fadeOut().fadeIn();
- $(thisbtn).val('Submit').attr('disabled',false);
- }
- });
- }
@@ -1915,55 +1714,9 @@ $(document).ready(function() {
});
function configureBroadcast(){
- var host = $("#coinjs_broadcast option:selected").val();
-
- // api: blockcypher blockchair chain.so
- // network name "btc" "bitcoin" "BTC"
- // network name "ltc" "litecoin" "LTC"
- // network name "doge" "dogecoin" "DOGE"
-
- $("#rawSubmitBtn").unbind("");
- if(host=="chain.so_bitcoinmainnet"){
- $("#rawSubmitBtn").click(function(){
- rawSubmitChainso(this, "BTC");
- });
- } else if(host=="chain.so_litecoin"){
- $("#rawSubmitBtn").click(function(){
- rawSubmitChainso(this, "LTC");
- });
- } else if(host=="chain.so_dogecoin"){
- $("#rawSubmitBtn").click(function(){
- rawSubmitChainso(this, "DOGE");
- });
- } else if(host=="blockcypher_bitcoinmainnet"){
- $("#rawSubmitBtn").click(function(){
- rawSubmitblockcypher(this, "btc");
- });
- } else if(host=="blockcypher_litecoin"){
- $("#rawSubmitBtn").click(function(){
- rawSubmitblockcypher(this, "ltc");
- });
- } else if(host=="blockcypher_dogecoin"){
- $("#rawSubmitBtn").click(function(){
- rawSubmitblockcypher(this, "doge");
- });
- } else if(host=="blockchair_bitcoinmainnet"){
- $("#rawSubmitBtn").click(function(){
- rawSubmitblockchair(this, "bitcoin");
- });
- } else if(host=="blockchair_litecoin"){
- $("#rawSubmitBtn").click(function(){
- rawSubmitblockchair(this, "litecoin");
- });
- } else if(host=="blockchair_dogecoin"){
- $("#rawSubmitBtn").click(function(){
- rawSubmitblockchair(this, "dogecoin");
- });
- } else {
- $("#rawSubmitBtn").click(function(){
- rawSubmitDefault(this); // revert to default
- });
- }
+ $("#rawSubmitBtn").click(function(){
+ rawSubmitDefault(this); // revert to default
+ });
}
function configureGetUnspentTx(){