-
Notifications
You must be signed in to change notification settings - Fork 48
Expand file tree
/
Copy pathwallet.min.js
More file actions
1 lines (1 loc) · 60.7 KB
/
wallet.min.js
File metadata and controls
1 lines (1 loc) · 60.7 KB
1
var encrypted_wallet_data=null;var guid=null;var cVisible;var password;var dpassword=null;var dpasswordhash;var sharedKey;var final_balance=0;var total_sent=0;var total_received=0;var n_tx=0;var n_tx_filtered=0;var isInitialized=false;var latest_block=null;var address_book=[];var transactions=[];var double_encryption=false;var tx_page=0;var tx_filter=0;var maxAddr=400;var nconnected;var addresses=[];var offline=false;var pbkdf2_iterations=10;var payload_checksum=null;var addressToAdd=null;var privateKeyToSweep=null;var isSignup=false;var archTimer;var mixer_fee=1.5;$.fn.center=function(){this.css("top",Math.max(($(window).height()-this.height())/2+$(window).scrollTop(),10)+"px");this.css("left",Math.max(($(window).width()-this.width())/2+$(window).scrollLeft(),10)+"px");return this};$(window).resize(function(){$(".modal:visible").center()});function setLoadingText(a){$(".loading-text").text(a)}function hideNotice(a){$("#"+a).remove()}function doStuffTimer(){try{if(WebSocket!=null){if((!offline&&isInitialized)&&(ws==null||ws.readyState!=WebSocket.OPEN)){_webSocketConnect()}}}catch(a){console.log(a)}}function webSocketConnect(){if(!isInitialized||offline){return}try{if(window.WebSocket){_webSocketConnect()}else{makeNotice("info","misc-notice","Your Browser Does not support native WebSockets");window.WEB_SOCKET_SWF_LOCATION=resource+"wallet/WebSocketMain.swf";loadScript(resource+"wallet/swfobject.js",function(){loadScript(resource+"wallet/web_socket.js",function(){_webSocketConnect()})})}}catch(a){console.log(a)}}function _webSocketConnect(){try{ws=new WebSocket(getWebSocketURL());if(!ws){return}ws.onmessage=function(h){try{var c=$.parseJSON(h.data);if(c.op=="status"){$("#status").html(c.msg)}else{if(c.op=="on_change"){var k=Crypto.util.bytesToHex(Crypto.SHA256(encrypted_wallet_data,{asBytes:true}));var g=c.checksum;console.log("On change old "+k+" == new "+g);if(k!=g){updateCacheManifest();setTimeout(getWallet,250)}}else{if(c.op=="utx"){var f=TransactionFromJSON(c.x);for(var d=0;d<transactions.length;++d){if(transactions[d].txIndex==f.txIndex){return}}playSound("beep");var o=0;for(var d=0;d<f.inputs.length;d++){var l=f.inputs[d];var j=addresses[l.prev_out.addr];if(j){var m=parseInt(l.prev_out.value);if(j.tag!=2){o-=m;total_sent+=m}j.balance-=m}}for(var d=0;d<f.out.length;d++){var b=f.out[d];var j=addresses[b.addr];if(j){var m=parseInt(b.value);if(j.tag!=2){o+=m;total_received+=m}j.balance+=m}}flashTitle("New Transaction");f.result=o;final_balance+=o;n_tx++;f.setConfirmations(0);if(tx_filter==0&&tx_page==0){transactions.unshift(f);buildVisibleView()}}else{if(c.op=="block"){flashTitle("New Block");for(var d=0;d<c.x.txIndexes.length;++d){for(var n=0;n<transactions.length;++n){if(transactions[n].txIndex==c.x.txIndexes[d]){if(transactions[n].blockHeight==null||transactions[n].blockHeight==0){transactions[n].blockHeight=c.x.height;break}}}}setLatestBlock(BlockFromJSON(c.x));buildTransactionsView()}}}}}catch(h){console.log(h);console.log(h.data)}};ws.onopen=function(){$("#status").html("CONNECTED.");var f='{"op":"blocks_sub"}';if(guid!=null){f+='{"op":"wallet_sub","guid":"'+guid+'"}'}try{var c=getActiveAddresses();for(var b=0;b<c.length;++b){f+='{"op":"addr_sub", "addr":"'+c[b]+'"}'}}catch(d){alert(d)}ws.send(f)};ws.onclose=function(){$("#status").html("DISCONNECTED.")}}catch(a){console.log(a)}}function makeNotice(b,e,d,c){if(d==null||d.length==0){return}console.log(d);if(c==null){c=5000}var a=$('<div class="alert alert-block alert-'+b+'"></div>');a.text(""+d);if($("#"+e).length>0){a.attr("id",e);return}$("#notices").append(a).hide().fadeIn(200);if(c>0){(function(){var f=a;setTimeout(function(){f.fadeOut(250,function(){$(this).remove()})},c)})()}}function noConvert(a){return a}function base58ToBase58(a){return decryptPK(a)}function base58ToBase64(a){var b=decodePK(a);return Crypto.util.bytesToBase64(b)}function base58ToHex(a){var b=decodePK(a);return Crypto.util.bytesToHex(b)}function base58ToSipa(a,f){var b=decodePK(a);var c=new Bitcoin.ECKey(b);while(b.length<32){b.unshift(0)}b.unshift(128);if(c.getBitcoinAddressCompressed().toString()==f){b.push(1)}var d=Crypto.SHA256(Crypto.SHA256(b,{asBytes:true}),{asBytes:true});b=b.concat(d.slice(0,4));var e=B58.encode(b);return e}function makeWalletJSON(d){var c=noConvert;if(d=="base64"){c=base58ToBase64}else{if(d=="hex"){c=base58ToHex}else{if(d=="sipa"){c=base58ToSipa}else{if(d=="base58"){c=base58ToBase58}}}}var a='{\n "guid" : "'+guid+'",\n "sharedKey" : "'+sharedKey+'",\n';if(double_encryption&&dpasswordhash!=null&&c==noConvert){a+=' "double_encryption" : '+double_encryption+',\n "dpasswordhash" : "'+dpasswordhash+'",\n'}a+=' "keys" : [\n';var e=false;for(var b in addresses){var f=addresses[b];a+=' {"addr" : "'+f.addr+'"';if(f.priv!=null){a+=',\n "priv" : "'+c(f.priv,f.addr)+'"'}if(f.tag==2){a+=',\n "tag" : '+f.tag}if(f.label!=null){a+=',\n "label" : "'+f.label+'"'}a+="},\n";e=true}if(e){a=a.substring(0,a.length-2)}a+="\n ]";if(nKeys(address_book)>0){a+=',\n "address_book" : [\n';for(var b in address_book){a+=' {"addr" : "'+b+'",\n';a+=' "label" : "'+address_book[b]+'"},\n'}a=a.substring(0,a.length-2);a+="\n ]"}a+="\n}";return a}function deleteAddressBook(a){delete address_book[a];backupWalletDelayed();$("#send-coins").find(".tab-pane").trigger("show",true)}function apiGetTicker(){$.get(root+"ticker").success(function(c){var a=$("#send-ticker ul").empty();a.append('<li class="nav-header">Exchange Rates</li>');for(var b in c){a.append('<li><div style="width:35px;padding-left:10px;font-weight:bold;display:inline-block">'+b+'</div> <i class="icon-user" style="background-image:url('+resource+((c[b].last>=c[b].avg24hr)?"up_green.png":"down_red.png")+');width:14px;background-position:0px"></i>'+convert(satoshi,c[b].last)+"</li>")}a.append('<li style="font-size:10px;padding-left:10px;">Delayed By Up To 15 minutes</li>')})}function buildSendTxView(a){apiGetTicker();$("#send-coins").find(".tab-pane.active").trigger("show",a);if(a){$(".send").attr("disabled",false)}}function buildSelect(a,b,f){var e=a.val();a.empty();for(var d in addresses){var g=addresses[d];if(!g||g.tag==2){continue}var c=g.label;if(!c){c=g.addr.substring(0,15)+"..."}if(b||g.balance>0){a.prepend('<option value="'+g.addr+'">'+c+" - "+formatBTC(g.balance)+" BTC</option>")}}a.prepend('<option value="any" selected>Any Address</option>');if(!f&&e){a.val(e)}}function buildSendForm(b,c){buildSelect(b.find('select[name="from"]'),false,c);buildSelect(b.find('select[name="change"]'),true,c);b.find('select[name="change"]').prepend('<option value="new">New Address</option>');if(c){b.find("input").val("");b.find(".send-value-usd").html("$0")}var a=b.find(".recipient-container");if(c){var d=a.find(".recipient:first-child").clone();a.empty().append(d)}a.find(".recipient").find('input[name="send-to-address"]').typeahead({source:getActiveLabels()});a.find(".recipient").find('input[name="send-value"]').unbind().keyup(function(){$(this).parent().find(".send-value-usd").html(formatSymbol($(this).val()*100000000,symbol_local))});b.find(".remove-recipient").unbind().click(function(){var e=a.find(".recipient").length;if(e>1){if(e==2){$(this).hide(200)}a.find(".recipient:last-child").remove()}});b.find(".add-recipient").unbind().click(function(){var e=a.find(".recipient:first-child").clone();e.appendTo(a);e.find('input[name="send-to-address"]').val("").typeahead({source:getActiveLabels()});e.find(".send-value-usd").html("$0");e.find('input[name="send-value"]').val("").keyup(function(){$(this).parent().find(".send-value-usd").html(formatSymbol($(this).val()*100000000,symbol_local))});b.find(".remove-recipient").show(200)})}function importPyWalletJSONObject(d){var b=0;try{for(b=0;b<d.keys.length;++b){if(walletIsFull()){return}var a=privateKeyStringToKey(d.keys[b].sec,detectPrivateKeyFormat(d.keys[b].sec));if(d.keys[b].addr==a.getBitcoinAddress().toString()||d.keys[b].addr==a.getBitcoinAddressCompressed().toString()){internalAddKey(d.keys[b].addr,encodePK(a.priv))}else{makeNotice("error","misc-error","Private key doesn't seem to match the address. Possible corruption",1000);return false}}}catch(c){makeNotice("error","misc-error","Exception caught parsing importing JSON. Incorrect format?");return false}makeNotice("success","misc-success","Imported "+b+" private keys")}function parsePrivateKeysFromText(d){var f=d.split(/\s+/g);try{var a=false;for(var c in f){var j=f[c];if(walletIsFull()){break}try{var h=detectPrivateKeyFormat(j);var b=privateKeyStringToKey(j,h);if(h=="compsipa"){internalAddKey(b.getBitcoinAddressCompressed().toString(),encodePK(b.priv))}else{internalAddKey(b.getBitcoinAddress().toString(),encodePK(b.priv))}a=true}catch(g){}}if(a){backupWallet("update",function(){queryAPIMultiAddress()});return true}}catch(g){makeNotice("error","misc-error",g)}return false}function importJSON(){var a=$("#import-json").val();if(a==null||a.length==0){throw"No import data provided!"}var c=null;try{c=$.parseJSON(a);if(c==null){throw"null input_text"}}catch(b){decrypt(a,password,function(d){try{c=$.parseJSON(d);return(c!=null)}catch(f){return false}})}getSecondPassword(function(){try{if(c==null){console.log("Error Parsing JSON. Trying Plain Text import.");if(parsePrivateKeysFromText(a)){return true}else{throw"Could not decode import data"}}if(c==null||c.keys==null||c.keys.length==0){throw"No keys imported. Incorrect format?"}if(c.keys[0].hexsec!=null){importPyWalletJSONObject(c)}else{for(var h=0;h<c.keys.length;++h){var k=c.keys[h].addr;if(k==null||k.length==0||k=="undefined"){continue}try{if(c.keys[h].priv!=null){if(c.double_encryption){var d=decrypt(c.keys[h].priv,c.sharedKey+dpassword,isBase58);if(d==null){throw"Error decrypting private key for address "+k}c.keys[h].priv=d}var g=privateKeyStringToKey(c.keys[h].priv,detectPrivateKeyFormat(c.keys[h].priv));if(g.getBitcoinAddress().toString()==k||g.getBitcoinAddressCompressed().toString()==k){internalAddKey(k,encodePK(g.priv))}else{throw"Not importing "+k+" becuse it is inconsistent with the decoded address "}}else{internalAddKey(k)}var f=addresses[k];f.label=c.keys[h].label;if(c.keys[h].tag!=null){f.tag=c.keys[h].tag}else{f.tag=1}}catch(j){makeNotice("error","misc-error",j)}}if(c.address_book!=null){for(var h=0;h<c.address_book.length;++h){internalAddAddressBookEntry(c.address_book[h].addr,c.address_book[h].label)}}}checkAllKeys();$("#import-input_text").val("");backupWallet("update",function(){queryAPIMultiAddress()})}catch(j){makeNotice("error","misc-error",j)}})}function getAllAddresses(){var b=[];for(var a in addresses){b.push(a)}return b}function getPreferredAddress(){var b=null;for(var a in addresses){var c=addresses[a];if(b==null){b=c.addr}if(c.priv!=null){if(b==null){b=c.addr}if(c.tag==null||c.tag==0){b=c.addr;break}}}return b}function getAddressesWithTag(a){var d=[];for(var b in addresses){var c=addresses[b];if(c.tag==a){d.push(c.addr)}}return d}function getActiveAddresses(){return getAddressesWithTag()}function getArchivedAddresses(){return getAddressesWithTag(2)}function setLatestBlock(a){latest_block=a}Transaction.prototype.getCompactHTML=function(f,c){var a=this.result;var e='<tr><td style="width:16px" class="hidden-phone"><a target="new" href="'+root+"tx-index/"+this.txIndex+"/"+this.hash+'"><img src="'+resource+'info.png" /></a></td><td class="hidden-phone"><ul style="margin-left:0px;" class="short-addr">';var b=true;if(a>0){if(this.inputs.length>0){for(var d=0;d<this.inputs.length;d++){input=this.inputs[d];if(input.prev_out==null||input.prev_out.addr==null){e+="<li>No Input (Newly Generated Coins)</li>"}else{var g=f[input.prev_out.addr];if(g&&g.tag!=2){continue}b=false;e+=formatOutput(input.prev_out,f,c)}}}else{e+="<li>No inputs, transaction probably sent from this.</li>"}}else{if(a<0){for(var d=0;d<this.out.length;d++){var g=f[this.out[d].addr];if(this.out.length>1&&this.out[d].type==0&&g&&g.tag!=2){continue}b=false;e+=formatOutput(this.out[d],f,c)}}}if(b){e+='<span class="label">Moved Between Wallet</info>'}e+="</ul></td><td>";if(this.time>0){e+=dateToString(new Date(this.time*1000))}if(this.confirmations==0){e+=' <span class="label label-important pull-right hidden-phone" onclick="showInventoryModal(\''+this.hash+"')\">Unconfirmed Transaction!</span> "}else{if(this.confirmations>0){e+=' <span class="label label-info pull-right hidden-phone">'+this.confirmations+" Confirmations</span> "}}e+="</td>";if(a>0){e+='<td style="color:green">'+formatMoney(a,true)+"</td>"}else{if(a<0){e+='<td style="color:red">'+formatMoney(a,true)+"</td>"}else{e+="<td>"+formatMoney(a,true)+"</td>"}}if(this.balance==null){e+="<td></td>"}else{e+='<td class="hidden-phone">'+formatMoney(this.balance)+"</td>"}e+="</tr>";return e};function buildVisibleView(a){try{cVisible.find(".pop").popover("hide")}catch(b){}var c=cVisible.attr("id");if("send-coins"==c){buildSendTxView(a)}else{if("home-intro"==c){buildHomeIntroView(a)}else{if("receive-coins"==c){buildReceiveCoinsView(a)}else{if("my-transactions"==c){buildTransactionsView(a)}}}}if(final_balance==null){$("#balance").html("Loading...")}else{$("#balance").html(formatSymbol(final_balance,symbol));$("#balance2").html(formatSymbol(final_balance,(symbol==symbol_local)?symbol_btc:symbol_local))}}function buildHomeIntroView(){$("#summary-n-tx").html(n_tx);$("#summary-received").html(formatMoney(total_received,true));$("#summary-sent").html(formatMoney(total_sent,true));$("#summary-balance").html(formatMoney(final_balance,symbol))}function buildTransactionsView(){var g=$("#tx_display").val();if(transactions.length==0){$("#transactions-header").hide();return}else{$("#transactions-header").show()}var d=null;var c=0;if(d!=null){clearInterval(d);d=null}var a=$("#transactions").empty();if(g==0){var k=$('<table class="table table-striped table-condensed"><tr><th style="width:16px" class="hidden-phone"></th><th class="hidden-phone">To / From</th><th>Date</th><th>Amount</th><th class="hidden-phone">Balance</th></tr></table>');a.append(k);a=k}var l=function(){var o="";for(var n=c;n<transactions.length&&n<(c+5);++n){var m=transactions[n];if(m.blockHeight!=null&&m.blockHeight>0&&latest_block!=null){var p=latest_block.height-m.blockHeight+1;if(p<=100){m.setConfirmations(latest_block.height-m.blockHeight+1)}}else{m.setConfirmations(0)}if(g==0){o+=m.getCompactHTML(addresses,address_book)}else{o+=m.getHTML(addresses,address_book)}}a.append(o);c+=5;if(c<transactions.length){d=setTimeout(l,1)}};l();var b=$(".pagination ul").empty();if(tx_page==0&&transactions.length<50){b.hide();return}else{b.show()}var e=Math.ceil(n_tx_filtered/50);var h=" disabled";if(tx_page>0){h=""}b.append('<li onclick="setPage(tx_page-1)" class="prev'+h+'"><a>← Previous</a></li>');for(var j=0;j<e&&j<=15;++j){var f="";if(tx_page==j){f=' class="active"'}b.append('<li onclick="setPage('+j+')"'+f+'><a class="hidden-phone">'+j+"</a></li>")}var h=" disabled";if(tx_page<e){h=""}b.append('<li onclick="setPage(tx_page+1)" class="next'+h+'"><a>Next →</a></li>')}function setFilter(a){tx_page=0;tx_filter=a;queryAPIMultiAddress()}function setPage(a){tx_page=a;scroll(0,0);queryAPIMultiAddress()}function parseMultiAddressJSON(c,d){var f=$.parseJSON(c);if(f.info){$("#nodes-connected").html(f.info.nconnected);if(f.info.latest_block!=null){setLatestBlock(f.info.latest_block)}var e=f.info.symbol_local;if(symbol==symbol_local){symbol_local=e;symbol=e;calcMoney()}else{symbol_local=e}}if(!d){mixer_fee=f.mixer_fee}transactions=[];if(f.wallet==null){total_received=0;total_sent=0;final_balance=0;n_tx=0;n_tx_filtered=0;return}total_received=f.wallet.total_received;total_sent=f.wallet.total_sent;final_balance=f.wallet.final_balance;n_tx=f.wallet.n_tx;n_tx_filtered=f.wallet.n_tx_filtered;for(var b=0;b<f.addresses.length;++b){if(addresses[f.addresses[b].address]){addresses[f.addresses[b].address].balance=f.addresses[b].final_balance}}for(var b=0;b<f.txs.length;++b){var a=TransactionFromJSON(f.txs[b]);transactions.push(a)}}function queryAPIMultiAddress(a){if(!isInitialized||offline){return}setLoadingText("Loading transactions");$.ajax({type:"POST",url:root+"multiaddr?filter="+tx_filter+"&offset="+tx_page*50,data:{active:getActiveAddresses().join("|"),archived:getArchivedAddresses().join("|")},converters:{"* text":window.String,"text html":true,"text json":window.String,"text xml":$.parseXML},success:function(b){if(b.error!=null){makeNotice("error","misc-error",b.error)}try{parseMultiAddressJSON(b,false);buildVisibleView();try{if(tx_page==0&&tx_filter==0){localStorage.setItem("multiaddr",b)}}catch(c){}if(a){a()}}catch(c){console.log(b);makeNotice("error","misc-error",c)}},error:function(b){console.log(b);makeNotice("error","misc-error",b.responseText)}})}function showClaimModal(b){var c=$("#claim-modal");c.modal({keyboard:true,backdrop:"static",show:true});c.find(".balance").text("Loading...");var a=b.getBitcoinAddress().toString();loadScript(resource+"wallet/qr.code.creator.js",function(){var d=makeQRCode(300,300,1,a);$("#claim-qr-code").empty().append(d)});apiGetBalance([a],function(d){if(d==0){c.find(".spent").show(200)}else{c.find(".spent").hide(200)}c.find(".balance").text("Amount: "+formatBTC(d)+" BTC")},function(){c.find(".balance").text("Error Fetching Balance")});c.find(".create").unbind().click(function(){window.location=root+"wallet/new"+window.location.hash});c.find(".login").unbind().click(function(){c.modal("hide")});c.find(".forward").unbind().click(function(){$("#claim-manual").show(200);$("#claim-manual-send").unbind().click(function(){loadScript(resource+"wallet/signer.min.js",function(){var f=$("#claim-manual-address").val();try{new Bitcoin.Address(f)}catch(h){makeNotice("error","misc-error","Invalid Bitcoin Address");return}var d=privateKeyToSweep.getBitcoinAddress().toString();internalAddKey(f);var g=initNewTx();g.from_addresses=[d];g.extra_private_keys[d]=B58.encode(privateKeyToSweep.priv);g.start();c.modal("hide")})});$(this).hide()})}function didDecryptWallet(){if(addressToAdd!=null){if(walletIsFull()){return}showWatchOnlyWarning(addressToAdd,function(){if(internalAddKey(addressToAdd)){makeNotice("success","added-addr","Added Watch Only Address "+addressToAdd);backupWalletDelayed()}else{makeNotice("error","error-addr","Error Adding Bitcoin Address")}})}if(privateKeyToSweep!=null){loadScript(resource+"wallet/signer.min.js",function(){var d=privateKeyToSweep.getBitcoinAddress().toString();var e=initNewTx();e.from_addresses=[d];e.extra_private_keys[d]=B58.encode(privateKeyToSweep.priv);e.start()})}window.location.hash="";try{var a=localStorage.getItem("guid");if(a!=guid){localStorage.clear();console.log("Set GUID "+guid);localStorage.setItem("guid",guid)}else{var b=localStorage.getItem("multiaddr");if(b!=null){parseMultiAddressJSON(b,true);buildVisibleView()}}}catch(c){}queryAPIMultiAddress();changeView($("#home-intro"));$("#initial_error").remove();$("#initial_success").remove();makeNotice("success","misc-success","Sucessfully Decrypted Wallet")}function getWallet(){for(var a in addresses){var b=addresses[a];if(b.tag==1){alert("Warning! wallet data may have changed but cannot sync as you have uns-saved keys");return}}console.log("Get wallet with checksum "+payload_checksum);$.get(root+"wallet/wallet.aes.json?guid="+guid+"&sharedKey="+sharedKey+"&checksum="+payload_checksum+"&format=plain").success(function(c){if(c==null||c.length==0){return}if(c=="Not modified"){console.log("Not modified");return}else{console.log("Wallet data modified");encrypted_wallet_data=c;payload_checksum=Crypto.util.bytesToHex(Crypto.SHA256(encrypted_wallet_data,{asBytes:true}));internalRestoreWallet();queryAPIMultiAddress();buildVisibleView()}})}function internalRestoreWallet(){try{if(encrypted_wallet_data==null||encrypted_wallet_data.length==0){makeNotice("error","misc-error","No Wallet Data To Decrypt");return false}var d=null;decrypt(encrypted_wallet_data,password,function(f){try{d=$.parseJSON(f);return(d!=null)}catch(g){return false}});if(d==null){throw"Error Decrypting Wallet. Please check your password is correct."}if(d.double_encryption!=null&&d.dpasswordhash!=null){double_encryption=d.double_encryption;dpasswordhash=d.dpasswordhash}addresses=[];for(var b=0;b<d.keys.length;++b){var a=d.keys[b];if(a.addr==null||a.addr.length==0||a.addr=="undefined"){makeNotice("error","null-error","Your wallet contains an undefined address. This is a sign of possible corruption, please double check all your BTC is accounted for. Backup your wallet to remove this error.",15000);continue}addresses[a.addr]=a}address_book=[];if(d.address_book!=null){for(var b=0;b<d.address_book.length;++b){internalAddAddressBookEntry(d.address_book[b].addr,d.address_book[b].label)}}sharedKey=d.sharedKey;if(sharedKey==null||sharedKey.length==0||sharedKey.length!=36){throw"Shared Key is invalid"}if(payload_checksum==null||payload_checksum.length==0){payload_checksum=Crypto.util.bytesToHex(Crypto.SHA256(encrypted_wallet_data,{asBytes:true}))}else{getWallet()}setIsIntialized();return true}catch(c){makeNotice("error","misc-error",c)}return false}function getSecondPassword(f,b){if(!double_encryption||dpassword!=null){if(f){try{f()}catch(d){makeNotice("error","misc-error",d)}}return}var c=$("#second-password-modal");c.modal({keyboard:true,backdrop:"static",show:true});var a=c.find('input[name="password"]');a.unbind().keypress(function(g){if(g.keyCode==13){g.preventDefault();c.find(".btn.btn-primary").click()}});a.val("");c.find(".btn.btn-primary").unbind().click(function(){var g=a.val();if(vaidateDPassword(g)){if(f){try{f()}catch(h){makeNotice("error","misc-error",h)}}}else{makeNotice("error","misc-error","Password incorrect.");if(b){try{b()}catch(h){makeNotice("error","misc-error",h)}}}c.modal("hide")});c.find(".btn.btn-secondary").unbind().click(function(){makeNotice("error","misc-error","User cancelled, password needed to continue.");c.modal("hide");if(b){try{b()}catch(g){makeNotice("error","misc-error",g)}}})}function restoreWallet(){guid=$("#restore-guid").val();if(guid==null||guid.length!=36){makeNotice("error","misc-error","Invalid wallet identifier");return false}else{hideNotice("guid-error")}password=$("#restore-password").val();if(password.length==0||password.length<8||password.length>255){makeNotice("error","misc-error","Password length must be between least 10 & 255 characters");return false}else{hideNotice("password-error")}var a=$("#restore-offline").is(":checked");if(a){try{if(localStorage==null){makeNotice("error","misc-error","Your browser does not support local stoage. Cannot login in offline mode.");return false}else{if(localStorage.getItem("multiaddr")!=null){makeNotice("error","misc-error","Local storage not empty. Have you enabled private browsing?.");return false}}}catch(c){console.log(c)}}if(encrypted_wallet_data==null||encrypted_wallet_data.length==0){setLoadingText("Validating authentication key");var b=$("#restore-auth-key").val();if(b==null||b.length==0||b.length>255){makeNotice("error","misc-error","You must enter a Two Factor authetication code");return false}$.post("/wallet",{guid:guid,payload:b,length:b.length,method:"get-wallet",format:"plain"},function(d){encrypted_wallet_data=d;if(internalRestoreWallet()){if(a){getReadyForOffline()}else{didDecryptWallet()}}else{if(a){$("#offline-mode-modal").modal("hide")}}}).error(function(d){makeNotice("error","misc-error",d.responseText)})}else{if(internalRestoreWallet()){if(a){getReadyForOffline()}else{didDecryptWallet()}}else{if(a){$("#offline-mode-modal").modal("hide")}}}return true}function setIsIntialized(){isInitialized=true;webSocketConnect();$("#tech-faq").hide();$("#intro-text").hide();$("#large-summary").show();$("#status-container").show()}function importPrivateKeyUI(b,a,c){getSecondPassword(function(){try{if(!b||b.length==0){throw"You must enter a private key to import"}if(walletIsFull()){return}var g=detectPrivateKeyFormat(b);var d=privateKeyStringToKey(b,g);if(g=="compsipa"){var h=d.getBitcoinAddressCompressed().toString();showCompressedPrivateKeyWarning(function(){if(h==null||h.length==0||h=="undefined"){throw"Unable to decode bitcoin addresses from private key"}if(internalAddKey(h,encodePK(d.priv))){addresses[h].tag=1;if(a&&a.length>0){addresses[h].label=a}buildVisibleView();backupWallet("update",function(){queryAPIMultiAddress()});if(c){c()}makeNotice("success","added-adress","Added bitcoin address "+h)}},function(){loadScript(resource+"wallet/signer.min.js",function(){var e=initNewTx();e.from_addresses=[h];e.extra_private_keys[h]=B58.encode(d.priv);e.start()})})}else{var h=d.getBitcoinAddress().toString();if(h==null||h.length==0||h=="undefined"){throw"Unable to decode bitcoin addresses from private key"}if(internalAddKey(h,encodePK(d.priv))){addresses[h].tag=1;if(a&&a.length>0){addresses[h].label=a}buildVisibleView();backupWallet("update",function(){queryAPIMultiAddress()});if(c){c()}makeNotice("success","added-adress","Added bitcoin address "+h)}else{throw"Unable to add private key for bitcoin address "+h}}}catch(f){makeNotice("error","misc-error","Error importing private key: "+f)}})}function validateEmail(c){var b=c.lastIndexOf("@");var a=c.lastIndexOf(".");return(b<a&&b>0&&c.indexOf("@@")==-1&&a>2&&(c.length-a)>2)}function emailBackup(){if(!isInitialized||offline){return}setLoadingText("Sending email backup");$.post("/wallet",{guid:guid,sharedKey:sharedKey,method:"email-backup",format:"plain"},function(a){makeNotice("success","backup-success",a)}).error(function(a){makeNotice("error","misc-error",a.responseText)})}function encrypt(b,a){return Crypto.AES.encrypt(b,a,{mode:new Crypto.mode.CBC(Crypto.pad.iso10126),iterations:pbkdf2_iterations})}function decrypt(d,c,g,b){try{var a=Crypto.AES.decrypt(d,c,{mode:new Crypto.mode.CBC(Crypto.pad.iso10126),iterations:pbkdf2_iterations});if(a!=null&&a.length>0){if(g(a)){return a}}}catch(f){console.log(f)}try{var a=Crypto.AES.decrypt(d,c,{iterations:1});if(a!=null&&a.length>0){if(g(a)){return a}}}catch(f){console.log(f)}try{var a=Crypto.AES.decrypt(d,c,{mode:new Crypto.mode.CBC(Crypto.pad.iso10126),iterations:1});if(a!=null&&a.length>0){if(g(a)){return a}}}catch(f){console.log(f)}if(b!=null){b()}return null}function updateCacheManifest(){try{console.log("Clear Cache Manifest");window.applicationCache.update()}catch(a){console.log(a)}}function backupWalletDelayed(d,c,b,a){if(archTimer!=null){clearInterval(archTimer);archTimer=null}archTimer=setTimeout(function(){backupWallet(d,c,b,a)},3000)}function backupWallet(a,c,j,b){if(offline){return}try{if(a==null){a="update"}if(!isInitialized&&a!="insert"){return false}if(guid.length!=36){throw"Invalid wallet identifier"}var f=makeWalletJSON();var i=encrypt(f,password);if(i.length==0){throw"Error enrypting the JSON output"}var d=null;decrypt(i,password,function(k){try{d=$.parseJSON(k);return(d!=null)}catch(l){return false}});if(d==null){makeNotice("error","misc-error","Error Decrypting Wallet, Not saving. This is a serious error..");return false}var g=Crypto.util.bytesToHex(Crypto.SHA256(i,{asBytes:true}));setLoadingText("Saving wallet");if(b==null){b=""}encrypted_wallet_data=i;$.ajax({type:"POST",url:root+"wallet"+b,data:{guid:guid,length:i.length,payload:i,sharedKey:sharedKey,checksum:g,old_checksum:payload_checksum,method:a},converters:{"* text":window.String,"text html":true,"text json":window.String,"text xml":window.String},success:function(k){var m=false;for(var e in addresses){var l=addresses[e];if(l.tag==1){l.tag=null;m=true}if(m){buildVisibleView()}}payload_checksum=g;makeNotice("success","misc-success",k);if(c!=null){c()}updateCacheManifest()},error:function(e){makeNotice("error","misc-error",e.responseText,10000);if(j!=null){j()}}})}catch(h){makeNotice("error","misc-error",h,10000);throw h}}function encryptPK(a){if(double_encryption){if(dpassword==null){throw"Cannot encrypt private key without a password"}return encrypt(a,sharedKey+dpassword)}else{return a}return null}function encodePK(a){var b=B58.encode(a);return encryptPK(b)}function isBase58(b){for(var a=0;a<b.length;++a){if(b[a]<0||b[a]>58){return false}}return true}function decryptPK(a){if(double_encryption){if(dpassword==null){throw"Cannot decrypt private key without a password"}return decrypt(a,sharedKey+dpassword,isBase58)}else{return a}return null}function decodePK(b){var a=decryptPK(b);if(a!=null){return B58.decode(a)}return null}function vaidateDPassword(b){var a=Crypto.SHA256(sharedKey+b,{asBytes:true});var d=a;for(var c=1;c<pbkdf2_iterations;++c){d=Crypto.SHA256(d,{asBytes:true})}var f=Crypto.util.bytesToHex(d);if(f==dpasswordhash){dpassword=b;return true}if(Crypto.util.bytesToHex(a)==dpasswordhash){dpassword=b;dpasswordhash=f;return true}var e=Crypto.SHA256(b);if(e==dpasswordhash){dpassword=b;dpasswordhash=f;return true}return false}function checkAllKeys(a){for(var b in addresses){var f=addresses[b];if(f.addr==null){throw"Null Address Found in wallet "+b}if(f.addr.toString()==null){throw"Error decoding wallet address "+f.addr}if(f.priv!=null){var e=decodePK(f.priv);var d=new Bitcoin.ECKey(e);var c=d.getBitcoinAddress().toString();if(c!=f.addr&&d.getBitcoinAddressCompressed().toString()!=f.addr){throw"Private key does not match bitcoin address "+f.addr+" != "+c}if(a){f.priv=encodePK(e)}}}makeNotice("success","wallet-success","Wallet verified.")}function checkAndSetPassword(){var a=$("#password").val();var b=$("#password2").val();if(a!=b){makeNotice("error","misc-error","Passwords do not match.");return false}if(a.length==0||a.length<10||a.length>255){makeNotice("error","misc-error","Password must be 10 characters or more in length");return false}password=a;return true}function updatePassword(){if(!isInitialized||offline){return}var a=$("#update-password-modal");a.modal({keyboard:true,backdrop:"static",show:true});a.find(".btn.btn-primary").unbind().click(function(){a.modal("hide");var c=password;if(!checkAndSetPassword()){return false}try{backupWallet("update",function(){window.location=root+"wallet/"+guid+window.location.hash},function(){makeNotice("error","misc-error","Error syncing wallet. Password Not changed");password=c})}catch(b){makeNotice("error","misc-error","Error syncing wallet. Password Not changed");password=c}});a.find(".btn.btn-secondary").unbind().click(function(){a.modal("hide")})}function changeView(a){if(a===cVisible){return}if(cVisible!=null){if($("#"+cVisible.attr("id")+"-btn").length>0){$("#"+cVisible.attr("id")+"-btn").parent().attr("class","")}cVisible.hide()}cVisible=a;cVisible.show();if($("#"+cVisible.attr("id")+"-btn").length>0){$("#"+cVisible.attr("id")+"-btn").parent().attr("class","active")}buildVisibleView(true)}function nKeys(c){var b=0,a;for(a in c){b++}return b}function internalDeletePrivateKey(a){addresses[a].priv=null}function internalDeleteAddress(a){delete addresses[a]}function internalAddAddressBookEntry(b,a){address_book[b]=a}function walletIsFull(a){if(nKeys(addresses)>=maxAddr){makeNotice("error","misc-error","We currently support a maximum of "+maxAddr+" private keys, please remove some unsused ones.");return true}return false}function internalAddKey(c,a){var b=addresses[c];if(b==null||b.length==0){addresses[c]={addr:c,priv:a,balance:0};return true}else{if(b.priv==null&&a!=null){b.priv=a;return true}}return false}function showInventoryModal(b){var a=$("#inv-modal");a.modal({keyboard:true,backdrop:"static",show:true});setLoadingText("Getting Inventory Data");$("#inv-data").hide();$.get(root+"inv/"+b+"?format=json").success(function(g){$("#inv-data").show(200);$("#initial_ip").html('<a href="'+root+"ip-address/"+g.initial_ip+'">'+g.initial_ip+"</a>");$("#initial_time").html(dateToString(new Date(parseInt(g.initial_time))));$("#last_seen").html(dateToString(new Date(parseInt(g.last_time))));$("#inv_n_connected").html(g.nconnected);$("#total_relayed").html(g.relayed_count);$("#p_network").html(g.relayed_percent);var d=$("#inv_mining_nodes");d.empty();var c=[];for(var e=0;e<g.mining_nodes.length;++e){var f=g.mining_nodes[e];if(c[f.name]==null){c[f.name]=true;d.append('<li><a href="'+f.link+'">'+f.name+"</a></li>")}}if(g.mining_nodes==0){d.append("<li>No mining nodes have receivied this transaction. It is unlikely to be included in any blocks and will be clear in approximatly 24 hours.</li>")}}).error(function(c){a.modal("hide");makeNotice("error","misc-error",c.responseText)});a.find(".btn.btn-secondary").unbind().click(function(){a.modal("hide")})}function labelAddress(c){var a=$("#label-address-modal");a.modal({keyboard:true,backdrop:"static",show:true});a.find(".address").text(c);var b=a.find('input[name="label"]');a.find(".address").text(c);b.val("");a.find(".btn.btn-primary").unbind().click(function(){a.modal("hide");var d=b.val();if(d.length==0){makeNotice("error","misc-error","you must enter a label for the address");return false}addresses[c].label=d;backupWalletDelayed();buildVisibleView()});a.find(".btn.btn-secondary").unbind().click(function(){a.modal("hide")})}function addAddressBookEntry(){var c=$("#add-address-book-entry-modal");c.modal({keyboard:true,backdrop:"static",show:true});var a=c.find('input[name="label"]');var b=c.find('input[name="address"]');a.val("");b.val("");c.find(".btn.btn-primary").unbind().click(function(){c.modal("hide");var f=$.trim(a.val());var d=$.trim(b.val());if(f.length==0){makeNotice("error","misc-error","you must enter a label for the address book entry");return false}if(d.length==0){makeNotice("error","misc-error","you must enter a bitcoin address for the address book entry");return false}var h;try{h=new Bitcoin.Address(d);if(h==null){throw"Null address"}}catch(g){makeNotice("error","misc-error","Bitcoin address invalid, please make sure you entered it correctly");return false}if(address_book[d]!=null){makeNotice("error","misc-error","Bitcoin address already exists");return false}makeNotice("success","misc-success","Added Address book entry");internalAddAddressBookEntry(d,f);backupWalletDelayed();$("#send-coins").find(".tab-pane").trigger("show",true)});c.find(".btn.btn-secondary").unbind().click(function(){c.modal("hide")})}function deleteAddresses(g){var j=$("#delete-address-modal");j.modal({keyboard:true,backdrop:"static",show:true});j.find(".btn.btn-primary").hide();j.find(".btn.btn-danger").hide();$("#change-mind").hide();j.find("#to-delete-address").html(g.join(" "));j.find("#delete-balance").empty();var c=j.find("#delete-balance");var a=[];for(var f in g){var h=g[f];if(addresses[h]&&addresses[h].priv){a.push(g[f])}}apiGetBalance(a,function(i){j.find(".btn.btn-primary").show(200);j.find(".btn.btn-danger").show(200);c.html("Balance "+formatBTC(i)+" BTC");if(i>0){c.css("color","red")}else{c.css("color","black")}},function(){j.find(".btn.btn-primary").show(200);j.find(".btn.btn-danger").show(200);c.text("Error Fetching Balance")});var d=false;var f=0;var b=null;var e=10;changeMind=function(){$("#change-mind").show();$("#change-mind-time").text(e-f)};j.find(".btn.btn-primary").unbind().click(function(){changeMind();j.find(".btn.btn-primary").hide();j.find(".btn.btn-danger").hide();b=setInterval(function(){if(d){return}++f;changeMind();if(f==e){$("#delete-address-modal").modal("hide");makeNotice("warning","warning-deleted","Private Key Removed From Wallet");for(var i in g){internalDeletePrivateKey(g[i])}buildVisibleView();backupWallet();clearInterval(b)}},1000)});j.find(".btn.btn-danger").unbind().click(function(){changeMind();j.find(".btn.btn-primary").hide();j.find(".btn.btn-danger").hide();b=setInterval(function(){if(d){return}++f;changeMind();if(f==e){try{$("#delete-address-modal").modal("hide");makeNotice("warning","warning-deleted","Address & Private Key Removed From Wallet");for(var i in g){internalDeleteAddress(g[i])}buildVisibleView();backupWallet("update",function(){queryAPIMultiAddress()})}finally{clearInterval(b)}}},1000)});j.on("hidden",function(){if(b){d=true;clearInterval(b);b=null}});j.find(".btn.btn-secondary").unbind().click(function(){j.modal("hide")})}function getActiveLabels(){var c=[];for(var a in address_book){c.push(address_book[a])}for(var a in addresses){var b=addresses[a];if(b.tag!=2&&b.label){c.push(b.label)}}return c}function apiGetBalances(c,b,a){setLoadingText("Getting Balances");$.post("/multiaddr",{active:c.join("|"),simple:true,format:"json"},function(d){b(d)}).error(function(d){a(d.responseText)})}function apiGetBalance(c,b,a){setLoadingText("Getting Balance");$.get(root+"q/addressbalance/"+c.join("|")+"?format=plain").success(function(d){b(d)}).error(function(d){a(d.responseText)})}function sweepAddresses(a){getSecondPassword(function(){var c=$("#sweep-address-modal");c.modal("show");apiGetBalance(a,function(d){c.find(".balance").text("Amount: "+formatBTC(d)+" BTC")},function(){c.find(".balance").text("Error Fetching Balance")});var b=c.find('select[name="change"]');buildSelect(b,true);c.find(".btn.btn-primary").unbind().click(function(){loadScript(resource+"wallet/signer.min.js",function(){var d=initNewTx();d.from_addresses=a;if(b.val()!="any"){d.change_address=new Bitcoin.Address(b.val())}d.start()});c.modal("hide")});c.find(".btn.btn-secondary").unbind().click(function(){c.modal("hide")})})}function buildPopovers(){try{$(".pop").popover({offset:10,placement:"bottom"})}catch(a){}}function bind(){$(".dropdown-toggle").dropdown();$("#chord-diagram").click(function(){window.open(root+"taint/"+getActiveAddresses().join("|"),null,"width=850,height=850")});$("#group-received").click(function(){loadScript(resource+"wallet/taint_grouping.min.js",function(){try{loadTaintData()}catch(d){makeNotice("error","misc-error","Unable To Load Taint Grouping Data")}})});buildPopovers();$("#download-backup-btn").click(function(){window.open(root+"wallet/wallet.aes.json?guid="+guid+"&sharedKey="+sharedKey)});var b=$("#second-password"),a=false,c=false;$("#keyboard li").click(function(){var f=$(this),e=f.html();if(f.hasClass("left-shift")||f.hasClass("right-shift")){$(".letter").toggleClass("uppercase");$(".symbol span").toggle();a=(a===true)?false:true;c=false;return false}if(f.hasClass("capslock")){$(".letter").toggleClass("uppercase");c=true;return false}if(f.hasClass("delete")){var d=b.val();b.val(d.substr(0,d.length-1));return false}if(f.hasClass("symbol")){e=$("span:visible",f).html()}if(f.hasClass("space")){e=" "}if(f.hasClass("tab")){e="\t"}if(f.hasClass("return")){e="\n"}if(f.hasClass("uppercase")){e=e.toUpperCase()}if(a===true){$(".symbol span").toggle();if(c===false){$(".letter").toggleClass("uppercase")}a=false}b.val(b.val()+e)});$("#logout").click(function(){window.location.reload()});$("#refresh").click(function(){getWallet();queryAPIMultiAddress()});$("#enable_archived_checkbox").change(function(){var d=$(this).is(":checked");$(".archived_checkbox").attr("checked",false);$(".archived_checkbox").attr("disabled",!d);$("#archived-sweep").attr("disabled",!d);$("#archived-delete").attr("disabled",!d)});$("#anonymous-addresses").on("show",function(){var d=$(this);loadScript(resource+"wallet/anonymous-addresses.min.js",function(){buildAnonymousTable(d)})});$("#active-addresses").on("show",function(){var i=$(this).find("table:first");i.find("tbody:gt(0)").remove();var f=i.find("tbody").empty();for(var h in addresses){var k=addresses[h];if(k.tag==2){continue}var g="";if(k.tag==1){g=' <font color="red" class="pop" title="Not Synced" data-content="This is a new address which has not yet been synced with our the server. Do not used this address yet.">(Not Synced)</font>'}else{if(k.priv==null){g=' <font color="red" class="pop" title="Watch Only" data-content="Watch Only means there is no private key associated with this bitcoin address. <br /><br /> Unless you have the private key stored elsewhere you do not own the funds at this address and can only observe the transactions.">(Watch Only)</font>'}}var d="";var e=k.addr;if(k.label!=null){e=k.label;d='<span class="hidden-phone"> - '+k.addr+"</span>"}var j='<tr><td style="width:20px;"><img id="qr'+k.addr+'" onclick="showAddressModal(\''+k.addr+'\')" src="'+resource+'info.png" /></td><td><div class="short-addr"><a class="pop" title="Your Addresses" data-content="These are your personal bitcoin addresses. Share these with people and they can send you bitcoins." href="'+root+"address/"+k.addr+'" target="new">'+e+"</a>"+d+" "+g+'<div></td><td><span style="color:green">'+formatBTC(k.balance)+'<span class="hidden-phone"> BTC</span></span></td><td style="width:16px"><img src="'+resource+'archive.png" class="pop" title="Archive Address" data-content="Click this button to hide the address from the main view. You can restore or delete later by finding it in the Archived addresses tab. " onclick="archiveAddr(\''+k.addr+"')\" /></td></tr>";f.append(j)}buildPopovers()});$("#archived-addresses").on("show",function(){$("#enable_archived_checkbox").attr("checked",false);$("#archived-delete").attr("disabled",true);$("#archived-sweep").attr("disabled",true);$("#archived-addr tbody").empty();var e=$(this).find("tbody");var d=getArchivedAddresses();var f=function(){e.empty();for(var j in d){var l=addresses[d[j]];if(l.tag!=2){continue}var i="";if(l.priv==null){i=' <font color="red">(Watch Only)</font>'}var g="";var h=l.addr;if(l.label!=null){h=l.label;g='<span class="hidden-phone"> - '+l.addr+"</span>"}var k='<tr><td style="width:20px;"><input type="checkbox" class="archived_checkbox" value="'+l.addr+'" disabled></td><td><div class="short-addr"><a href="'+root+"address/"+l.addr+'" target="new">'+h+"</a>"+g+" "+i+'<div></td><td><span style="color:green">'+formatBTC(l.balance)+'<span class="hidden-phone"> BTC</span></span></td><td style="width:16px"><img src="'+resource+'unarchive.png" onclick="unArchiveAddr(\''+l.addr+"')\" /></td></tr>";if(l.balance>0&&l.priv){e.prepend(k)}else{e.append(k)}}};f();apiGetBalances(d,function(h){for(var g in h){addresses[g].balance=h[g].final_balance}f()},function(g){makeNotice("error","misc-error",g)})});$("#archived-sweep").click(function(){var d=[];$(".archived_checkbox:checked").each(function(){var e=addresses[$(this).val()];if(e.priv==null){makeNotice("error","misc-error","Cannot Sweep Watch Only Address");return}d.push(e.addr)});if(d.length==0){return}sweepAddresses(d)});$("#archived-delete").click(function(){var d=[];$(".archived_checkbox:checked").each(function(){d.push($(this).val())});if(d.length==0){return}deleteAddresses(d)});$("#anonymous-never-ask").click(function(){SetCookie("anonymous-never-ask",$(this).is(":checked"))});$("#local_currency").click(function(){SetCookie("currency",$(this).val());queryAPIMultiAddress()});$("body").click(function(){rng_seed_time()});$("body").keypress(function(){rng_seed_time()});$("#deposit-cash").click(function(){loadScript(resource+"wallet/deposit/deposit.js",function(){showDepositModal(getPreferredAddress(),"bitinstant","Deposit Using Cash")})});$("#deposit-sms").click(function(){loadScript(resource+"wallet/deposit/deposit.js",function(){showDepositModal(getPreferredAddress(),"sms","Deposit Using Phone/SMS")})});$("#deposit-sms2").click(function(){$("#deposit-sms").trigger("click")});$("#payment-request").click(function(){loadScript(resource+"wallet/payment-request.js",function(){showPaymentRequestModal(getPreferredAddress(),"Payment Request")})});$("#deposit-bank").click(function(){loadScript(resource+"wallet/deposit/deposit.js",function(){showDepositModal(getPreferredAddress(),"direct","Deposit Using Bank Transfer / Credit Card")})});$("#show-import-export").click(function(){$("#export-warning").hide();$("#import-export-content").show(200)});$("#restore-password").keypress(function(d){if(d.keyCode==13){d.preventDefault();$("#restore-wallet-continue").click()}});$("#summary-n-tx-chart").click(function(){window.open(root+"charts/n-transactions?show_header=false&address="+getActiveAddresses().join("|"),null,"scroll=0,status=0,location=0,toolbar=0,width=1000,height=700")});$("#summary-received-chart").click(function(){window.open(root+"charts/received-per-day?show_header=false&address="+getActiveAddresses().join("|"),null,"scroll=0,status=0,location=0,toolbar=0,width=1000,height=700")});$("#summary-balance-chart").click(function(){window.open(root+"charts/balance?show_header=false&address="+getActiveAddresses().join("|"),null,"scroll=0,status=0,location=0,toolbar=0,width=1000,height=700")});$("#new-addr").click(function(){try{getSecondPassword(function(){var e=generateNewAddressAndKey();labelAddress(e.toString());buildVisibleView();backupWallet()})}catch(d){makeNotice("error","misc-error",d)}});$("#filter").change(function(){setFilter($(this).val())});$("#tx_display").change(function(){SetCookie("tx_display",$(this).val());buildVisibleView()}).val(parseInt(getCookie("tx_display")));$("#update-password-btn").click(function(){updatePassword()});$("#email-backup-btn").click(function(){emailBackup()});$("#dropbox-backup-btn").click(function(){window.open(root+"wallet/dropbox-login?guid="+guid+"&sharedKey="+sharedKey)});$("#gdrive-backup-btn").click(function(){window.open(root+"wallet/gdrive-login?guid="+guid+"&sharedKey="+sharedKey)});$("#wallet-login").unbind().click(function(){try{var d=localStorage.getItem("guid");if(d!=null){window.location=root+"wallet/"+d+window.location.hash;return}}catch(f){console.log(f)}window.location=root+"wallet/login"});$("#restore-wallet-continue").unbind().click(function(f){f.preventDefault();var d=$("#restore-guid").val();if(guid!=d&&d!=null){window.location=root+"wallet/"+d+window.location.hash;return}restoreWallet()});$("#import-export-btn").click(function(){if(!isInitialized){return}$("#import-json-btn").unbind().click(function(){if(!isInitialized){return}$(this).attr("disabled",true);try{importJSON()}catch(d){makeNotice("error","misc-error",d)}$(this).attr("disabled",false)});$("#import-address-btn").unbind().click(function(){var f=$.trim($("#import-address-address").val());if(f.length=0){makeNotice("error","misc-error","You must enter an address to import");return}if(walletIsFull()){return}try{var d=new Bitcoin.Address(f);if(d.toString()!=f){throw"Inconsistency between addresses"}$("#import-address-address").val("");showWatchOnlyWarning(f,function(){if(internalAddKey(f)){makeNotice("success","added-address","Sucessfully Added Address "+d);buildVisibleView();backupWallet("update",function(){queryAPIMultiAddress()})}else{throw"Internal Error "+d}})}catch(g){makeNotice("error","misc-error","Error importing address: "+g);return}});$("#import-private-scan").unbind().click(function(){if(!isInitialized){return}if(walletIsFull()){return}getSecondPassword(function(){loadScript(resource+"wallet/signer.min.js",function(){showPrivateKeyModal(function(d){var e=d.getBitcoinAddress().toString();if(internalAddKey(e,encodePK(d.priv))){buildVisibleView();backupWallet("update",function(){queryAPIMultiAddress()});makeNotice("success","added-adress","Added bitcoin address "+e)}else{throw"Unable to add private key for bitcoin address "+e}},function(d){makeNotice("error","misc-error",d)},"Any Private Key")})})});$("#import-private-btn").unbind().click(function(){if(!isInitialized){return}var d=$("#import-private-key");try{importPrivateKeyUI($.trim(d.val()))}catch(f){makeNotice("error","misc-error","Error importing private key: "+f)}d.val("")});$("#import-brain-wallet-btn").unbind().click(function(){if(!isInitialized){return}var g=$("#import-brain-wallet");var d=$.trim(g.val());if(d.length<15){makeNotice("error","misc-error","The passphrase must be at least 15 characters long");return}var f=Crypto.SHA256(d,{asBytes:true});try{importPrivateKeyUI(Bitcoin.Base58.encode(f),"Brain Wallet")}catch(h){makeNotice("error","misc-error","Error importing private key: "+h)}g.val("")});changeView($("#import-export"))});$("#add-address-book-entry-btn").click(function(){addAddressBookEntry()});$("#my-account-btn").click(function(){if(!isInitialized){return}loadScript(resource+"wallet/account.min.js",function(){setDoubleEncryptionButton();bindAccountButtons();getAccountInfo();changeView($("#my-account"))},function(d){makeNotice("error","misc-error",d)})});$("#large-summary").click(function(){toggleSymbol();buildVisibleView()});$("#home-intro-btn").click(function(){if(!isInitialized){return}changeView($("#home-intro"))});$("#my-transactions-btn").click(function(){if(!isInitialized){return}changeView($("#my-transactions"))});$("#send-coins-btn").click(function(){if(!isInitialized){return}changeView($("#send-coins"))});$("#send-quick").on("show",function(g,f){var d=$(this);buildSendForm(d,f);d.find(".send").unbind().click(function(){loadScript(resource+"wallet/signer.min.js",function(){startTxUI(d,"quick",initNewTx())})})});$("#send-email").on("show",function(g,f){var d=$(this);buildSendForm(d,f);d.find(".send").unbind().click(function(){loadScript(resource+"wallet/signer.min.js",function(){startTxUI(d,"email",initNewTx())})})});$("#send-anonymous").on("show",function(g,f){var d=$(this);buildSendForm(d,f);d.find(".mixer_fee").text(mixer_fee);d.find(".fees,.free,.bonus").show();if(mixer_fee<0){d.find(".fees,.free").hide()}else{if(mixer_fee==0){d.find(".fees,.bonus").hide()}else{d.find(".free,.bonus").hide()}}d.find(".send").unbind().click(function(){loadScript(resource+"wallet/signer.min.js",function(){startTxUI(d,"anonymous",initNewTx())})});d.find(".anonymous-fees").text("0.00");d.find('input[name="send-before-fees"]').unbind().bind("keyup change",function(){var h=parseFloat($.trim($(this).val()));var e=0;if(mixer_fee>0){e=parseFloat((h/100)*(100+mixer_fee)+0.0002)}else{e=parseFloat(h+0.0002);d.find(".bonus-value").text(-(Math.min($(this).val(),200)/100)*mixer_fee)}if(h<0.5){d.find(".anonymous-fees").text("0.00")}else{d.find(".anonymous-fees").text(e.toFixed(4))}d.find('input[name="send-value"]').val(e).trigger("keyup")})});$("#send-qr").on("show",function(){loadScript(resource+"wallet/llqrcode.js",function(){loadScript(resource+"wallet/qr.code.reader.js",function(){var d=initQRCodeReader("send-qr-reader",function(e){clearInterval(d);console.log(e)},resource+"wallet/")})})});$("#send-custom").on("show",function(g,f){var d=$(this);buildSendForm(d,f);d.find(".send").unbind().click(function(){loadScript(resource+"wallet/signer.min.js",function(){startTxUI(d,"custom",initNewTx())})});d.find('select[name="from"]').unbind().change(function(){var e=$(this).val();for(var h in e){if(e[h]=="any"){$(this).val("any");break}}});d.find(".reset").unbind().click(function(){buildSendForm(d,true)})});$("#send-satoshi-dice").on("show",function(f,d){loadScript(resource+"wallet/satoshidice.min.js",function(){try{buildForm()}catch(g){makeNotice("error","misc-error","Unable To Load Satoshi Dice Bets")}},function(g){makeNotice("error","misc-error",g)})});$("#send-sms").on("show",function(g,f){if(f){return}var d=$(this);buildSendForm(d);$.get(resource+"wallet/country_codes.html").success(function(e){d.find('select[name="sms-country-code"]').html(e)}).error(function(){makeNotice("error","misc-error","Error Downloading SMS Country Codes")});d.find(".send").unbind().click(function(){loadScript(resource+"wallet/signer.min.js",function(){var e=initNewTx();startTxUI(d,"sms",e)})})});$("#send-facebook").on("show",function(h,g){if(g){return}var d=$(this);var f;buildSendForm(d);loadScript("https://connect.facebook.net/en_US/all.js",function(){FB.init({appId:"289188934490223",status:true,xfbml:false,cookie:true});var j=d.find(".recipient").find('input[name="send-to-facebook"]');var k=d.find(".send");k.text("Facebook Login");k.addClass("btn-primary");k.removeClass("btn-success");j.attr("readonly",true);var i=[];function e(){FB.api("/me/friends",function(l){f=true;k.text("Send Payment");k.removeClass("btn-primary");k.addClass("btn-success");if(!l||l.error){makeNotice("error","add-error","Unknown Facebook Error")}else{var n=[];for(var m in l.data){n.push(l.data[m].name);i[l.data[m].name]=l.data[m].id}d.find(".recipient").find('input[name="send-to-facebook"]').typeahead({source:n});j.attr("readonly",false)}})}if(!f){FB.getLoginStatus(function(l){if(l.status==="connected"){e()}})}loadScript(resource+"wallet/signer.min.js",function(){k.unbind().click(function(){if(!f){FB.login(function(n){if(n.authResponse){e()}else{makeNotice("error","add-error","User cancelled login or did not fully authorize.")}})}else{var l=i[j.val()];j.data("fb-id",l);var m=initNewTx();m.ask_to_send=function(){var n=this;try{FB.ui({display:"iframe",method:"send",name:"You have received bitcoins!",description:"You have been sent "+formatBTC(n.facebook.amount.toString())+" BTC. Click the link for instructions on how to claim them.",to:n.facebook.to,link:"http://blockchain.co.uk/wallet/claim#"+decryptPK(n.facebook.addr.priv),picture:"http://blockchain.info/Resources/Bitcoin-logo.png"},function(p){try{if(p){n.send()}else{throw"Facebook message was not sent."}}catch(q){n.error(q)}})}catch(o){n.error(o)}};startTxUI(d,"facebook",m)}})})})});$("#address-book").on("show",function(){var e=$("#address-book-tbl tbody");if(nKeys(address_book)>0){e.empty();for(var d in address_book){e.append("<tr><td>"+address_book[d]+'</td><td><div class="addr-book-entry">'+d+'</div></td><td style="width:16px" class="hidden-phone"><img src="'+resource+'delete.png" onclick="deleteAddressBook(\''+d+"')\" /></td></tr>")}}});$('a[data-toggle="tab"]').on("show",function(d){$(d.target.hash).trigger("show")});$("#export-crypted").on("show",function(){var d=makeWalletJSON();var e=encrypt(d,password);$("#json-crypted-export").val(e)});$("#export-unencrypted").on("show",function(){getSecondPassword(function(){$("#export-priv-format").val("base58");$("#json-unencrypted-export").val(makeWalletJSON($("#export-priv-format").val()))})});$("#sync-bitcoind").on("show",function(){$("#rpc-step-1").hide();$("#rpc-step-2").hide();$("#rpc-body").hide();loadScript(resource+"wallet/bitcoindrpc.js",function(){checkForExtension(function(d){$("#rpc-step-2").show(200);syncWallet(function(){$("#rpc-step-2").hide();$("#rpc-body").show()})},function(d){$("#rpc-step-1").show(200)});$("#sync-bitcoind-btn").unbind().click(function(){syncWallet()});$("#rpc-continue-btn").unbind().click(function(){$("#rpc-step-2").hide();$("#rpc-body").show(200)})})});$("#export-paper-btn").click(function(){getSecondPassword(function(){var d=window.open(null,null,"width=700,height=800,toolbar=1");loadScript(resource+"wallet/qr.code.creator.js",function(){try{if(d==null){makeNotice("error","misc-error","Failed to open popup window");return}d.document.write("<!DOCTYPE html><html><head></head><body></body></html>");var f=$("body",d.document);var q=$('<table style="page-break-after:always;"></table>',d.document);f.append(q);var p=1;for(var o in addresses){var l=addresses[o];var i="Online Mode";if(l.tag==1){i="Offline Mode"}if(l.priv==null){continue}var g=decryptPK(l.priv);if(g==null){continue}var r=$("<tr></tr>",d.document);var j=$('<td><div style="height:225px;overflow:hidden"></div></td>',d.document);var m=makeQRCode(250,250,1,g,d.document);j.children(":first").append(m);r.append(j);var n="";if(l.label!=null){n=l.label+" - "}var h=$('<td style="padding-top:25px;"><h3>'+l.addr+"</h3><br /><small><p><b>"+g+"</b></p></small><br /><p>"+i+"</p><br /><p>"+n+"Balance "+formatBTC(l.balance)+" BTC</p> </td>",d.document);r.append(h);if(l.balance>0){q.prepend(r)}else{q.append(r)}if(p%3==0){q=$('<table style="page-break-after:always;"></table>',d.document);f.append(q)}p++}}catch(k){makeNotice("error","error-paper",k)}})})});$("#receive-coins-btn").click(function(){if(!isInitialized){return}changeView($("#receive-coins"))});$("#export-priv-format").change(function(d){$("#json-unencrypted-export").val(makeWalletJSON($("#export-priv-format").val()))});$(".show_adv").click(function(){console.log("Center");$(".modal:visible").center()});$(".modal").on("show",function(){$(this).center()}).on("shown",function(){$(this).center()})}function parseMiniKey(b){var c=Crypto.SHA256(b+"?");switch(c.slice(0,2)){case"00":var d=Crypto.SHA256(b,{asBytes:true});return d;break;case"01":var a=Crypto.util.hexToBytes(c.slice(2,4))[0];var e=Math.round(Math.pow(2,(a/4)));var d=Crypto.PBKDF2(b,"Satoshi Nakamoto",32,{iterations:e,asBytes:true});return d;break;default:console.log("invalid key");break}}function getSelectionText(){var c,a="";if(window.getSelection){c=window.getSelection();if(c.rangeCount){var d=c.getRangeAt(0).cloneContents();var b=document.createElement("div");b.appendChild(d);a=b.innerText}}else{if(document.selection&&document.selection.type=="Text"){a=document.selection.createRange().htmlText}}return a}function detectPrivateKeyFormat(b){if(/^5[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{50}$/.test(b)){return"sipa"}if(/^[LK][123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{51}$/.test(b)){return"compsipa"}if(/^[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{44}$/.test(b)||/^[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{43}$/.test(b)){return"base58"}if(/^[A-Fa-f0-9]{64}$/.test(b)){return"hex"}if(/^[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789=+\/]{44}$/.test(b)){return"base64"}if(/^S[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{21}$/.test(b)||/^S[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{25}$/.test(b)||/^S[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{29}$/.test(b)||/^S[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{30}$/.test(b)){var a=Crypto.SHA256(b+"?",{asBytes:true});if(a[0]===0||a[0]===1){return"mini"}}throw"Unknown Key Format "+b}function privateKeyStringToKey(b,d){var a=null;if(d=="base58"){a=B58.decode(b)}else{if(d=="base64"){a=Crypto.util.base64ToBytes(b)}else{if(d=="hex"){a=Crypto.util.hexToBytes(b)}else{if(d=="mini"){a=parseMiniKey(b)}else{if(d=="sipa"){var c=B58.decode(b);c.shift();a=c.slice(0,c.length-4)}else{if(d=="sipa"){var c=B58.decode(b);c.shift();a=c.slice(0,c.length-4)}else{if(d=="compsipa"){var c=B58.decode(b);c.shift();c.pop();a=c.slice(0,c.length-4)}else{throw"Unsupported Key Format"}}}}}}}if(a.length!=32){throw"Result not 32 bytes in length"}return new Bitcoin.ECKey(a)}$(document).ready(function(){setInterval(doStuffTimer,10000);$("input, button").attr("autocomplete","off");try{if(!isSignup){var g=decodeURI(window.location.hash.replace("#",""));var b={};if(g!=null&&g.length>0){var k=g.split("|");for(var h=0;h<k.length;h+=2){var q=k[h];var n=k[h+1];if(q&&n){b[q]=n}}}if(nKeys(b)==0&&g.length>0){try{privateKeyToSweep=privateKeyStringToKey(g,detectPrivateKeyFormat(g))}catch(m){makeNotice("error","error-addr","Error Decoding Private Key. Could not claim bitcoins.")}}var f=b.newaddr;if(f!=null&&addresses[f]==null){try{addressToAdd=new Bitcoin.Address(f).toString();console.log(addressToAdd)}catch(m){makeNotice("error","error-addr","Could not add Address "+m)}}var j=b.newpriv;if(j!=null){try{privateKeyToSweep=privateKeyStringToKey(j,detectPrivateKeyFormat(j))}catch(m){makeNotice("error","error-addr","Error Decoding Private Key. Could not claim bitcoins.")}}}}catch(m){console.log(m)}encrypted_wallet_data=$("#data-encrypted").text();guid=$("#data-guid").text();sharedKey=$("#data-sharedkey").text();payload_checksum=$("#data-checksum").text();bind();$("body").ajaxStart(function(){$(".loading-indicator").fadeIn(200)});$("body").ajaxStop(function(){$(".loading-indicator").hide()});try{if(guid.length==0){if(privateKeyToSweep){showClaimModal(privateKeyToSweep)}try{var l=localStorage.getItem("guid");if(l!=null){$("#restore-guid").val(l)}}catch(m){console.log(m)}}}catch(m){}cVisible=$("#restore-wallet");cVisible.show();var p=false;var d=17,c=86,a=67,o=67;$(document).keydown(function(r){try{if(r.keyCode==d||r.keyCode==o){p=true}if(p&&r.keyCode==a){var i=$.trim(getSelectionText());var s=addresses[i];if(s!=null&&s.priv==null){$("#watch-only-copy-warning-modal").modal("show")}}}catch(r){console.log(r)}}).keyup(function(i){if(i.keyCode==d||i.keyCode==o){p=false}})});function showWatchOnlyWarning(a,c){var b=$("#watch-only-modal");b.modal({keyboard:true,backdrop:"static",show:true});console.log(a);b.find(".address").text(a);b.find(".btn.btn-secondary").unbind().click(function(){b.modal("hide")});b.find(".btn.btn-primary").unbind().click(function(){c();b.modal("hide")})}function showCompressedPrivateKeyWarning(c,a){var b=$("#compressed-private-key-modal");b.modal({keyboard:true,backdrop:"static",show:true});b.find(".btn.btn-secondary").unbind().click(function(){c();b.modal("hide")});b.find(".btn.btn-primary").unbind().click(function(){a();b.modal("hide")})}function showAddressModal(b){var a=$("#qr-code-modal");a.modal({keyboard:true,backdrop:"static",show:true});loadScript(resource+"wallet/qr.code.creator.js",function(){var c=makeQRCode(300,300,1,b);$("#qr-data").empty().append(c)});a.find(".code").text(b);a.find(".btn.btn-secondary").unbind().click(function(){a.modal("hide")});a.find(".btn.btn-primary").unbind().click(function(){a.modal("hide");labelAddress(b)})}function internalArchive(a){buildVisibleView();backupWalletDelayed("update",function(){queryAPIMultiAddress()})}function unArchiveAddr(a){var a=addresses[a];if(a.tag==2){a.tag=null;internalArchive()}else{makeNotice("error","add-error","Cannot Unarchive This Address")}}function archiveAddr(a){if(getActiveAddresses().length<=1){makeNotice("error","add-error","You must leave at least one active address");return}var a=addresses[a];if(a.tag==null||a.tag==0){a.tag=2;internalArchive()}else{makeNotice("error","add-error","Cannot Archive This Address")}}function buildReceiveCoinsView(){$("#receive-coins").find(".tab-pane.active").trigger("show");setupToggle()}function _addPrivateKey(a){if(walletIsFull()){return false}if(a==null){throw"Unable to generate a new bitcoin address."}var c=a.getBitcoinAddress();console.log("Add Address "+c);if(c==null){throw"Generated invalid bitcoin address."}if(internalAddKey(c.toString(),encodePK(a.priv))){addresses[c].tag=1;makeNotice("info","new-address","Generated new bitcoin address "+c);try{ws.send('{"op":"addr_sub", "addr":"'+c+'"}')}catch(b){}}else{throw"Unable to add generated bitcoin address."}return c}function generateNewMiniPrivateKey(){while(true){var c=new Bitcoin.ECKey(false);var b="S"+Bitcoin.Base58.encode(c.priv).substr(0,21);var d=Crypto.SHA256(b+"?",{asBytes:true});if(d[0]==0){var a=Crypto.SHA256(b,{asBytes:true});return{addr:_addPrivateKey(new Bitcoin.ECKey(a)),miniKey:b}}}}function generateNewAddressAndKey(){var a=new Bitcoin.ECKey(false);return _addPrivateKey(a)};