diff --git a/supernode/index.html b/supernode/index.html index 90b5631..af9d208 100644 --- a/supernode/index.html +++ b/supernode/index.html @@ -13456,8 +13456,9 @@ const my_idx = subjectFloIdClosestNodesFloIdsFromLeft.indexOf(localbitcoinplusplus.wallets.my_local_flo_address); //const idx = Object.keys(localbitcoinplusplus.myClosestSupernodes).indexOf(getFLOId); //if(alowed_supernodes_flo_ids.includes(localbitcoinplusplus.wallets.my_local_flo_address)) { - // Get the list of "left side" Supernodes of the disconnected Supernode - let getLeftSusOfDisconnectedSu = subjectFloIdClosestNodesFloIdsFromLeft.slice(0, my_idx); + // Get the list of "left side" Supernodes of the disconnected Supernode + // If myIdx=0, increase its value by 1 to be used as 2nd param in slice + let getLeftSusOfDisconnectedSu = subjectFloIdClosestNodesFloIdsFromLeft.slice(0, my_idx+1); if(getLeftSusOfDisconnectedSu.length<1) return; console.table(getLeftSusOfDisconnectedSu); @@ -14281,19 +14282,21 @@ tempWS[sn].onclose = async function(evt) { console.info(`Closed ${evt.srcElement.url}`); if(!evt.wasClean) { - const switchMyWS = new backupSupernodesWebSocketObject(); + let switchMyWS = new backupSupernodesWebSocketObject(); let closedFloId = await switchMyWS.getFloIdFromWSUrl(evt.srcElement.url); - let nxtSu = await getNextSupernode(closedFloId); + let nxtSuObj = await getNextSupernode(closedFloId); + let nxtSu = nxtSuObj.trader_flo_address; if(typeof nxtSu !== "string") return; msg_obj.receiverFloAddress = nxtSu; - if ((nxtSu.trader_flo_address==localbitcoinplusplus.wallets.my_local_flo_address - || nxtSu.trader_flo_address==msg_obj.data.subject_flo_id)) { - let nxtSu2 = await getNextSupernode(nxtSu.trader_flo_address); + if ((nxtSu==localbitcoinplusplus.wallets.my_local_flo_address + || nxtSu==msg_obj.data.subject_flo_id)) { + let nxtSuObj2 = await getNextSupernode(nxtSu); + let nxtSu2 = nxtSuObj2.trader_flo_address; if(typeof nxtSu2 !== "string") return; msg_obj.receiverFloAddress = nxtSu2; - informOneSupernode(nxtSu2.trader_flo_address); + informOneSupernode(nxtSu2); } else if(typeof nxtSu !== "undefined") { - informOneSupernode(nxtSu.trader_flo_address); + informOneSupernode(nxtSu); } } }; @@ -15768,41 +15771,27 @@ params.currency ); + params.id = helper_functions.unique_id(); + params.status = 1; + if ( localbitcoinplusplus.master_configurations.tradableAsset1.includes( params.product ) ) { + const eqBTC = Number(parseFloat(params.withdrawing_amount).toFixed(8)); + if ( trade_margin.remaining_crypto_credit < 0 || - params.withdrawing_amount <= 0 || + eqBTC <= 0 || trade_margin.remaining_crypto_credit < - params.withdrawing_amount + eqBTC ) { err_msg = `Insufficient crypto balance to withdraw. You can withdraw upto: ${params.product} ${trade_margin.remaining_crypto_credit}`; showMessage(err_msg); throw new Error(err_msg); } - } else { - if ( - trade_margin.remaining_fiat_credit <= 0 || - params.withdrawing_amount <= 0 || - trade_margin.remaining_fiat_credit < - params.withdrawing_amount - ) { - err_msg = `Insufficient fiat balance to withdraw. You can withdraw upto: ${params.currency} ${trade_margin.remaining_fiat_credit}`; - showMessage(err_msg); - throw new Error(err_msg); - } - } - params.id = helper_functions.unique_id(); - params.status = 1; - if ( - localbitcoinplusplus.master_configurations.tradableAsset1.includes( - params.product - ) - ) { // Check how much cryptos the user can withdraw let withdrawer_btc_id = `${params.trader_flo_address}_${params.product}`; readDB("crypto_balances", withdrawer_btc_id).then( @@ -15816,9 +15805,7 @@ let withdrawer_btc_balance = Number( btc_balance_res.crypto_balance ).toFixed(8); - const eqBTC = Number( - parseFloat(params.withdrawing_amount).toFixed(8) - ); + let withdrawer_new_btc_balance = withdrawer_btc_balance - eqBTC; if ( @@ -15977,9 +15964,19 @@ showMessage(err_msg); throw new Error(err_msg); } + if ( + trade_margin.remaining_fiat_credit <= 0 || + params.withdrawing_amount <= 0 || + trade_margin.remaining_fiat_credit < + params.withdrawing_amount + ) { + err_msg = `Insufficient fiat balance to withdraw. You can withdraw upto: ${params.currency} ${trade_margin.remaining_fiat_credit}`; + showMessage(err_msg); + throw new Error(err_msg); + } // Check if there's no already a withdraw cash order of this user - /*ONLY DELETE A WITHDRAW ORDER WHEN A DEPOSITOR HAS CONFIRMED DEPOSIT - AND RECEIVER HAS CONFIRMED WITHDRAW*/ + /* ONLY DELETE A WITHDRAW ORDER WHEN A DEPOSITOR HAS CONFIRMED DEPOSIT + AND RECEIVER HAS CONFIRMED WITHDRAW*/ // Check how much Cash user can withdraw const trader_cash_id = `${params.trader_flo_address}_${params.currency}`; @@ -20854,6 +20851,12 @@ } ); + if(nextClosestSupernodeElem.length<1) { + let ms = `Error: Failed to connect to any supernode.`; + showMessage(ms); + return Promise.reject(ms); + } + ideal_supernode = `ws://${nextClosestSupernodeElem[0].ip}:${nextClosestSupernodeElem[0].port}`; await startWebSocket(ideal_supernode); @@ -21022,16 +21025,49 @@ // SYNC DATA OF ALL SUPERNODES IN MIDDLE OF SENDER AND RECEIVER // Get the Supernodes in between sender and receiver of this message const all_supernodes = Object.keys(localbitcoinplusplus.myClosestSupernodes); + const tableArray = [ + "deposit", + "cash_deposits", + "withdraw_cash", + "withdraw_btc", + "cash_balances", + "crypto_balances", + "buyOrders", + "sellOrders", + "system_btc_reserves_private_keys" + ]; + /* Sync/Forward data of all Supernodes between res_obj.initialSender (i.e + node which informed you about a another node's death) + and you. + */ for (let q = all_supernodes.length-1; q>=0; q--) { const su_obj = localbitcoinplusplus.myClosestSupernodes[all_supernodes[q]]; if(su_obj.trader_flo_address===res_obj.initialSender) break; if(su_obj.trader_flo_address===localbitcoinplusplus.wallets.my_local_flo_address) continue; - localbitcoinplusplus.actions.sync_backup_supernode_from_backup_supernode( - localbitcoinplusplus.wallets.my_local_flo_address, - "", + + // Send data to next Supernode + localbitcoinplusplus.actions.get_sharable_db_data( + tableArray, su_obj.trader_flo_address - ); + ).then(su_db_data=>{ + RM_RPC.send_rpc + .call( + this, + "sync_backup_supernode_from_backup_supernode_response", + su_db_data + ) + .then(server_sync_response => + doSend(server_sync_response, su_obj.trader_flo_address) + ); + }); + + // Sync data from other Supernodes as well + // localbitcoinplusplus.actions.sync_backup_supernode_from_backup_supernode( + // localbitcoinplusplus.wallets.my_local_flo_address, + // "", + // su_obj.trader_flo_address + // ); } break; @@ -27695,7 +27731,42 @@ }); } - function readDBbyIndex( + // function readDBbyIndex( + // tablename, + // index, + // indexValue, + // filter_deletables = true + // ) { + // return new Promise((resolve, reject) => { + // var transaction = db.transaction([tablename]); + // var objectStore = transaction.objectStore(tablename); + // let response = []; + // var myIndex = objectStore.index(index); + // myIndex.openCursor().onerror = function(event) { + // console.error("Error fetching data"); + // reject(event); + // }; + // myIndex.openCursor().onsuccess = function(event) { + // let cursor = event.target.result; + // if (cursor) { + // if (cursor.value[index] == indexValue) { + // if (filter_deletables == true) { + // if (typeof cursor.value.is_deletable == "undefined") { + // response.push(cursor.value); + // } + // } else { + // response.push(cursor.value); + // } + // } + // cursor.continue(); + // } else { + // resolve(response); + // } + // }; + // }); + // } + + function readDBbyIndex( tablename, index, indexValue, @@ -27705,12 +27776,11 @@ var transaction = db.transaction([tablename]); var objectStore = transaction.objectStore(tablename); let response = []; - var myIndex = objectStore.index(index); - myIndex.openCursor().onerror = function(event) { + objectStore.openCursor().onerror = function(event) { console.error("Error fetching data"); reject(event); }; - myIndex.openCursor().onsuccess = function(event) { + objectStore.openCursor().onsuccess = function(event) { let cursor = event.target.result; if (cursor) { if (cursor.value[index] == indexValue) { @@ -27806,6 +27876,8 @@ // leave the vector clock field unchanged } else { Obj.vectorClock += 1; + // If vectorClock is increased, also update timestamp + Obj.timestamp = +new Date(); } if (typeof Obj.timestamp !== "number") { Obj.timestamp = +new Date(); @@ -28294,6 +28366,41 @@ }); }, + // backup_readDBbyIndex( + // tablename, + // index, + // indexValue, + // filter_deletables = true + // ) { + // return new Promise((resolve, reject) => { + // this.transaction = this.db.transaction([tablename]); + // var objectStore = this.transaction.objectStore(tablename); + // let response = []; + // var myIndex = objectStore.index(index); + // myIndex.openCursor().onerror = function(event) { + // console.error("Error fetching data"); + // reject(event); + // }; + // myIndex.openCursor().onsuccess = function(event) { + // let cursor = event.target.result; + // if (cursor) { + // if (cursor.value[index] == indexValue) { + // if (filter_deletables == true) { + // if (typeof cursor.value.is_deletable == "undefined") { + // response.push(cursor.value); + // } + // } else { + // response.push(cursor.value); + // } + // } + // cursor.continue(); + // } else { + // resolve(response); + // } + // }; + // }); + // }, + backup_readDBbyIndex( tablename, index, @@ -28304,12 +28411,11 @@ this.transaction = this.db.transaction([tablename]); var objectStore = this.transaction.objectStore(tablename); let response = []; - var myIndex = objectStore.index(index); - myIndex.openCursor().onerror = function(event) { + objectStore.openCursor().onerror = function(event) { console.error("Error fetching data"); reject(event); }; - myIndex.openCursor().onsuccess = function(event) { + objectStore.openCursor().onsuccess = function(event) { let cursor = event.target.result; if (cursor) { if (cursor.value[index] == indexValue) { @@ -28400,6 +28506,8 @@ // leave the vector clock field unchanged } else { Obj.vectorClock += 1; + // If vectorClock is increased, also update timestamp + Obj.timestamp = +new Date(); } if (typeof Obj.timestamp !== "number") { Obj.timestamp = +new Date(); @@ -29273,6 +29381,7 @@ }); withdrawAssetButton.addEventListener("click", function(params) { + let asset_type = assetTypeInput.value; let receivinAddress = prompt( `Please enter your ${asset_type} receiving address.` ); @@ -29282,7 +29391,6 @@ throw new Error(err_msg); } - let asset_type = assetTypeInput.value; let tradeAmount = parseFloat(tradeAmountSelect.value); let fiatCurrency = currencySelect.value;