From 2fb10a8e3fb3f2be5d9a7a2fc2b0bd4aba3141cb Mon Sep 17 00:00:00 2001 From: Abhishek Sinha Date: Wed, 1 May 2019 20:53:44 +0530 Subject: [PATCH] fixed btc shares data entry into backup supernodes --- supernode/index.html | 662 +++++++++++++++++++++++++++---------------- 1 file changed, 417 insertions(+), 245 deletions(-) diff --git a/supernode/index.html b/supernode/index.html index d44e569..39de2dd 100644 --- a/supernode/index.html +++ b/supernode/index.html @@ -11118,6 +11118,14 @@ request.globalParams.receiverFloId = params[0].receiver_flo_address; } + /********************************************************************************/ + + // MUST REVIEW. + // THIS LOGIC IS WRONG WHEN BACKUP SUPERNODE IS ACTING SUPERNODE + // BECAUSE IT WILL SHOW BACKUP SU IN request.globalParams.primarySupernode BELOW + + /********************************************************************************/ + if (typeof params[0].trader_flo_address !=="string") { readDB('localbitcoinUser', '00-01').then(result=>{ if (typeof result !=="object" || typeof result.myLocalFLOAddress !=="string") { @@ -11514,7 +11522,8 @@ .encrypt( chunks, this_btc_tx_key - ) + ), + "trader_flo_address": params.trader_flo_address }; return chunk_array; }); @@ -11563,15 +11572,11 @@ this_btc_tx_key; const system_btc_reserves_private_keys_object = { - id: helper_functions - .unique_id(), - product: params - .product, - btc_address: params - .btc_address, + id: helper_functions.unique_id(), + product: params.product, + btc_address: params.btc_address, balance: null, - trader_flo_address: params - .trader_flo_address, + trader_flo_address: params.trader_flo_address, btc_private_key_shamirs_id: btc_private_key_shamirs_id, supernode_transaction_key: supernode_transaction_key } @@ -11840,7 +11845,7 @@ let eqBTC = RM_TRADE.calculateCryptoEquivalentOfCash( withdrawing_btc_amount_in_cash, params.currency, params.product); - eqBTC = parseFloat(eqBTC).toFixed(8); + eqBTC = Number(parseFloat(eqBTC).toFixed(8)); let withdrawer_new_btc_balance = withdrawer_btc_balance - eqBTC; if (withdrawer_new_btc_balance > 0 && @@ -12138,7 +12143,7 @@ break; case "retrieve_shamirs_secret_btc_pvtkey": - RM_RPC.filter_legit_requests(null, function (is_valid_request) { + RM_RPC.filter_legit_requests(params.trader_flo_address, function (is_valid_request) { if (is_valid_request !== true) return false; if (typeof params.btc_private_key_array !== "string" || typeof params.retrieve_pvtkey_req_id !== @@ -12231,12 +12236,7 @@ res_bal => { btc_eq_receiving_amount = - parseFloat( - btc_eq_receiving_amount - ) - .toFixed( - 8 - ); + Number(parseFloat(btc_eq_receiving_amount).toFixed(8)); res_bal .crypto_balance -= EqCryptoWd; @@ -12771,7 +12771,8 @@ .encrypt( chunks, this_btc_tx_key - ) + ), + "trader_flo_address": params.trader_flo_address }; return chunk_array; }); @@ -13099,7 +13100,7 @@ let eqBTC = RM_TRADE.calculateCryptoEquivalentOfCash( withdrawing_btc_amount_in_cash, params.currency, params.product); - eqBTC = parseFloat(eqBTC).toFixed(8); + eqBTC = Number(parseFloat(eqBTC).toFixed(8)); let withdrawer_new_btc_balance = withdrawer_btc_balance - eqBTC; if (withdrawer_new_btc_balance > 0 && @@ -13397,7 +13398,7 @@ break; case "retrieve_shamirs_secret_btc_pvtkey": - RM_RPC.filter_legit_backup_requests(null, function (is_valid_request) { + RM_RPC.filter_legit_backup_requests(params.trader_flo_address, function (is_valid_request) { if (is_valid_request !== true) return false; if (typeof params.btc_private_key_array !== "string" || typeof params.retrieve_pvtkey_req_id !== @@ -13490,12 +13491,12 @@ res_bal => { btc_eq_receiving_amount = - parseFloat( + Number(parseFloat( btc_eq_receiving_amount ) .toFixed( 8 - ); + )); res_bal .crypto_balance -= EqCryptoWd; @@ -14080,7 +14081,7 @@ const RM_TRADE = new localbitcoinplusplus.trade; let current_crypto_price = RM_TRADE.get_current_crypto_price_in_fiat(crypto_code, currency); if (typeof current_crypto_price == "object" && current_crypto_price.rate > 0) { - return parseFloat(price / current_crypto_price.rate).toFixed(8); + return Number(parseFloat(price / current_crypto_price.rate).toFixed(8)); } } let err_msg = `WARNING: Failed to calculate crypto equivalent of cash.`; @@ -14168,22 +14169,24 @@ const RM_TRADE = new localbitcoinplusplus.trade; btc_eq_receiving_amount = RM_TRADE.calculateCryptoEquivalentOfCash( receiving_amount, receiving_amount_currency, crypto_type); - btc_eq_receiving_amount = parseFloat(btc_eq_receiving_amount).toFixed(8); + btc_eq_receiving_amount = Number(parseFloat(btc_eq_receiving_amount).toFixed(8)); } let trx = bitjs[crypto_type].transaction(); let sum = 0; for (var key in utxo_list) { - if (utxo_list[key].confirmations > 0) { + if (utxo_list[key].confirmations !== 0) { var obj = utxo_list[key]; sum += obj.amount; if (btc_eq_receiving_amount <= sum) { trx.addinput(obj.txid, obj.vout, obj.scriptPubKey); + console.log('a'); break; } else { trx.addinput(obj.txid, obj.vout, obj.scriptPubKey); + console.log('b'); } } } @@ -14357,8 +14360,8 @@ readDB("crypto_balances", seller_btc_id).then(function (sellPipeBTCRes) { if (typeof sellPipeBTCRes == "object" && typeof sellPipeBTCRes.crypto_balance == "number") { - let seller_btc_balance = parseFloat(sellPipeBTCRes.crypto_balance) - .toFixed(8); + let seller_btc_balance = Number(parseFloat(sellPipeBTCRes.crypto_balance) + .toFixed(8)); let sell_price_in_inr = parseFloat(sellPipeObj.buy_price); let eqBTCSeller = RM_TRADE.calculateCryptoEquivalentOfCash( sell_price_in_inr, buyPipeObj.currency, buyPipeObj.product @@ -14438,7 +14441,7 @@ let new_seller_btc_balance = seller_btc_balance - eqBTCSeller; - new_seller_btc_balance = parseFloat(new_seller_btc_balance).toFixed(8); + new_seller_btc_balance = Number(parseFloat(new_seller_btc_balance).toFixed(8)); let sellerBTCResponseObject = { id: `${sellPipeObj.trader_flo_address}_${sellPipeObj.product}`, trader_flo_address: sellPipeObj @@ -14570,6 +14573,7 @@ "data_hash": hashed_data, "supernode_sign": signed_data, "supernodePubKey": user_data.myLocalFLOPublicKey, + "trader_flo_address": buyPipeObj.trader_flo_address, } callback(response_for_client); return true; @@ -15284,7 +15288,7 @@ // Add buy order backup_server_db_instance.backup_addDB("sellOrders", sellOrders_data).then(() => { showMessage(`Your sell order is placed successfully.`); - });; + }); } } } @@ -15402,6 +15406,68 @@ }); break; + case "trade_balance_updates": + if (typeof res_obj.params == "object" && typeof res_obj.params[0] == "object") { + const trade_balance_res = res_obj.params[0]; + // Only the relevent user node should get response + if(res_obj.params[0].trader_flo_address !== localbitcoinplusplus.wallets.my_local_flo_address) return; + // Verify data + let trade_info_str = JSON.stringify(trade_balance_res.trade_infos); + let buyer_cash_data_str = JSON.stringify(trade_balance_res.buyer_cash_data); + let seller_cash_data_str = JSON.stringify(trade_balance_res.seller_cash_data); + let buyer_btc_data_str = JSON.stringify(trade_balance_res.buyer_btc_data); + let seller_btc_data_str = JSON.stringify(trade_balance_res.seller_btc_data); + + let res_str = + `${trade_info_str}${buyer_cash_data_str}${seller_cash_data_str}${buyer_btc_data_str}${seller_btc_data_str}`; + let hashed_data = Crypto.SHA256(res_str); + + RM_RPC.filter_legit_backup_requests(trade_balance_res.trade_infos.buyer_flo_id, + function (is_valid_request) { + if (is_valid_request !== true) return false; + + if (localbitcoinplusplus.master_configurations.supernodesPubKeys.includes( + trade_balance_res.supernodePubKey)) { + if (RM_WALLET.verify(hashed_data, + trade_balance_res.supernode_sign, trade_balance_res.supernodePubKey)) { + + const backup_server_db_instance = localbitcoinplusplus.newBackupDatabase.db[res_obj.globalParams.senderFloId]; + + if(typeof backup_server_db_instance !== "object") { + let backup_db_error_msg = `WARNING: Unknown DB instance. DB Backup failed.`; + showMessage(backup_db_error_msg); + throw new Error(backup_db_error_msg); + }; + + // Delete orders in clients DB + try { + backup_server_db_instance.backup_removeinDB("buyOrders", trade_balance_res.trade_infos.buy_order_id); + backup_server_db_instance.backup_removeinDB("sellOrders", trade_balance_res.trade_infos.sell_order_id); + } catch (error) { + callback(false); + throw new Error(error); + } + + // Update balances in clients DB + try { + backup_server_db_instance.backup_updateinDB("cash_balances", trade_balance_res.buyer_cash_data, + trade_balance_res.trade_infos.buyer_flo_id); + backup_server_db_instance.backup_updateinDB("cash_balances", trade_balance_res.seller_cash_data, + trade_balance_res.trade_infos.seller_flo_id); + backup_server_db_instance.backup_updateinDB("crypto_balances", trade_balance_res.buyer_btc_data, + trade_balance_res.trade_infos.buyer_flo_id); + backup_server_db_instance.backup_updateinDB("crypto_balances", trade_balance_res.seller_btc_data, + trade_balance_res.trade_infos.seller_flo_id); + } catch (error) { + callback(false); + throw new Error(error); + } + } + } + }); + } + break; + case "update_all_withdraw_cash_depositor_claim": if (typeof res_obj.params !== "object" || typeof res_obj.params[0] !== "object") return; @@ -15597,6 +15663,96 @@ }); break; + case "send_back_shamirs_secret_supernode_pvtkey": + if (typeof res_obj.params == "object" && typeof res_obj.params[0] == "object") { + + if(typeof res_obj.globalParams.senderFloId !="string") return; + localbitcoinplusplus.kademlia.determineClosestSupernode(res_obj.globalParams.senderFloId) + .then(my_closest_su_list=>{ + const primarySupernodeOfThisUser = my_closest_su_list[0].data.id; + const backup_server_db_instance = localbitcoinplusplus.newBackupDatabase.db[primarySupernodeOfThisUser]; + + if(typeof backup_server_db_instance !== "object") { + let backup_db_error_msg = `WARNING: Unknown DB instance. DB Backup failed.`; + showMessage(backup_db_error_msg); + throw new Error(backup_db_error_msg); + }; + + backup_server_db_instance.backup_readDB("supernode_private_key_chunks", res_obj.params[0].chunk_val) + .then(function (res) { + if (typeof res=="object") { + let send_pvtkey_req = RM_RPC + .send_rpc + .call(this, "retrieve_shamirs_secret_supernode_pvtkey", { + private_key_chunk: res + }); + } else { + let send_pvtkey_req = RM_RPC + .send_rpc + .call(this, "retrieve_shamirs_secret_supernode_pvtkey", ""); + } + send_pvtkey_req.globalParams.primarySupernode = primarySupernodeOfThisUser; + doSend(send_pvtkey_req, res_obj.globalParams.senderFloId); + return; + }); + + }) + } + break; + + case "send_back_shamirs_secret_btc_pvtkey": + if (typeof res_obj.params == "object" && typeof res_obj.params[0] == "object") { + + if(typeof res_obj.globalParams.senderFloId !="string") return; + localbitcoinplusplus.kademlia.determineClosestSupernode(res_obj.globalParams.senderFloId) + .then(my_closest_su_list=>{ + const primarySupernodeOfThisUser = my_closest_su_list[0].data.id; + const backup_server_db_instance = localbitcoinplusplus.newBackupDatabase.db[primarySupernodeOfThisUser]; + + if(typeof backup_server_db_instance !== "object") { + let backup_db_error_msg = `WARNING: Unknown DB instance. DB Backup failed.`; + showMessage(backup_db_error_msg); + throw new Error(backup_db_error_msg); + }; + + backup_server_db_instance.backup_readDB("supernode_private_key_chunks", res_obj.params[0].chunk_val).then(function ( + res) { + let send_pvtkey_req = RM_RPC + .send_rpc + .call(this, "retrieve_shamirs_secret_btc_pvtkey", { + retrieve_pvtkey_req_id: res_obj.params[0].retrieve_pvtkey_req_id, + private_key_chunk: res, + withdraw_id: res_obj.params[0].withdraw_id + }); + //if(typeof send_pvtkey_req.globalParams !== "object") send_pvtkey_req.globalParams = []; + //send_pvtkey_req.globalParams.primarySupernode = res_obj.globalParams.senderFloId; + doSend(send_pvtkey_req, res_obj.globalParams.senderFloId); + return; + }); + }); + } + break; + + case "store_shamirs_secret_pvtkey_shares": + if (typeof res_obj.params == "object" && typeof res_obj.params[0] == "object") { + + if(typeof res_obj.params[0].trader_flo_address !="string") return; + localbitcoinplusplus.kademlia.determineClosestSupernode(res_obj.params[0].trader_flo_address) + .then(my_closest_su_list=>{ + const primarySupernodeOfThisUser = my_closest_su_list[0].data.id; + const backup_server_db_instance = localbitcoinplusplus.newBackupDatabase.db[primarySupernodeOfThisUser]; + + if(typeof backup_server_db_instance !== "object") { + let backup_db_error_msg = `WARNING: Unknown DB instance. DB Backup failed.`; + showMessage(backup_db_error_msg); + throw new Error(backup_db_error_msg); + }; + delete res_obj.params[0].trader_flo_address; + backup_server_db_instance.backup_addDB("supernode_private_key_chunks", res_obj.params[0]); + }); + } + break; + default: break; } @@ -15825,9 +15981,12 @@ try { var res_obj = JSON.parse(res); - if (typeof res_obj.globalParams.receiverFloId=="string" - && res_obj.globalParams.receiverFloId !== - localbitcoinplusplus.wallets.my_local_flo_address) { + if (typeof res_obj.method !== "string" + || typeof res_obj.globalParams !== "object" + || typeof res_obj.globalParams.receiverFloId !== "string" + || res_obj.globalParams.receiverFloId !== + localbitcoinplusplus.wallets.my_local_flo_address) { + showMessage(`WARNING: Incomplete onMessage request received.`); return; } @@ -16029,7 +16188,7 @@ case "withdraw_request_method": response_from_sever = RM_RPC.receive_rpc_response.call(this, JSON.stringify(res_obj)); - doSend(JSON.stringify(response_from_sever)); // send response to client + //doSend(JSON.stringify(response_from_sever)); // send response to client break; case "withdrawal_request_response": if (typeof res_obj.params == "object" && typeof res_obj.params[0] == "object") { @@ -16212,6 +16371,7 @@ delete res_obj.params[0].private_key_chunk; res_obj.params[0].btc_private_key_array = JSON.stringify(btc_pvt_arr[ retrieve_pvtkey_req_id]); + res_obj.params[0].trader_flo_address = localbitcoinplusplus.wallets.my_local_flo_address; RM_RPC.receive_rpc_response.call(this, JSON.stringify(res_obj)); btc_pvt_arr[retrieve_pvtkey_req_id] = []; // Unset the object } @@ -16220,7 +16380,7 @@ case "deposit_withdraw_user_claim": if (typeof localbitcoinplusplus.wallets.MY_SUPERNODE_PRIVATE_KEY == - "undefined") throw new Error("Supernode Private Keys is undefind."); + "undefined") throw new Error("Supernode Private Keys is undefined."); if (typeof res_obj.params == "object" && typeof res_obj.params[0] == "object") { let user_claim_request = res_obj.params[0]; @@ -17051,7 +17211,7 @@ case "withdraw_request_method": response_from_sever = RM_RPC.backup_receive_rpc_response.call(this, JSON.stringify(res_obj)); - doSend(JSON.stringify(response_from_sever)); // send response to client + //doSend(JSON.stringify(response_from_sever)); // send response to client break; case "withdrawal_request_response": if (typeof res_obj.params == "object" && typeof res_obj.params[0] == "object") { @@ -17082,27 +17242,27 @@ showMessage(backup_db_error_msg); throw new Error(backup_db_error_msg); }; - }) - backup_server_db_instance.backup_readDB("userPublicData", cancel_request.trader_flo_address).then((trader_data) => { - if (typeof trader_data.trader_flo_address !== "string" || typeof trader_data - .trader_flo_pubKey !== "string") { - err_msg="ERROR: Failed to cancel the trade. User is unknown."; - showMessage(err_msg); - throw new Error(err_msg); - } - tradeDB = cancel_request.trade_type == "buy" ? "buyOrders" : - "sellOrders"; - if (RM_WALLET - .verify(cancel_request.trade_id, cancel_request.signed_trade_id, - trader_data.trader_flo_pubKey)) { - backup_server_db_instance.backup_removeinDB(tradeDB, cancel_request.trade_id) - .then((id) => showMessage(`Trade Id ${id} deleted.`)); - } else { - showMessage( - `Failed to verify trade for trade id ${cancel_request.trade_id}` - ); - } + backup_server_db_instance.backup_readDB("userPublicData", cancel_request.trader_flo_address).then((trader_data) => { + if (typeof trader_data.trader_flo_address !== "string" || typeof trader_data + .trader_flo_pubKey !== "string") { + err_msg="ERROR: Failed to cancel the trade. User is unknown."; + showMessage(err_msg); + throw new Error(err_msg); + } + tradeDB = cancel_request.trade_type == "buy" ? "buyOrders" : + "sellOrders"; + if (RM_WALLET + .verify(cancel_request.trade_id, cancel_request.signed_trade_id, + trader_data.trader_flo_pubKey)) { + backup_server_db_instance.backup_removeinDB(tradeDB, cancel_request.trade_id) + .then((id) => showMessage(`Trade Id ${id} deleted.`)); + } else { + showMessage( + `Failed to verify trade for trade id ${cancel_request.trade_id}` + ); + } + }) }) } else { showMessage("Failed to cancel trade."); @@ -17165,8 +17325,8 @@ case "store_shamirs_secret_pvtkey_shares": if (typeof res_obj.params == "object" && typeof res_obj.params[0] == "object") { - if(typeof res_obj.globalParams.primarySupernode !="string") return; - localbitcoinplusplus.kademlia.determineClosestSupernode(res_obj.globalParams.primarySupernode) + if(typeof res_obj.params[0].trader_flo_address !="string") return; + localbitcoinplusplus.kademlia.determineClosestSupernode(res_obj.params[0].trader_flo_address) .then(my_closest_su_list=>{ const primarySupernodeOfThisUser = my_closest_su_list[0].data.id; const backup_server_db_instance = localbitcoinplusplus.newBackupDatabase.db[primarySupernodeOfThisUser]; @@ -17176,9 +17336,9 @@ showMessage(backup_db_error_msg); throw new Error(backup_db_error_msg); }; + delete res_obj.params[0].trader_flo_address; + backup_server_db_instance.backup_addDB("supernode_private_key_chunks", res_obj.params[0]); }); - - backup_server_db_instance.backup_addDB("supernode_private_key_chunks", res_obj.params[0]); } break; case "send_back_shamirs_secret_supernode_pvtkey": @@ -17195,26 +17355,26 @@ showMessage(backup_db_error_msg); throw new Error(backup_db_error_msg); }; - }) - - backup_server_db_instance.backup_readDB("supernode_private_key_chunks", res_obj.params[0].chunk_val) - .then(function (res) { - if (typeof res=="object") { - let send_pvtkey_req = RM_RPC - .send_rpc - .call(this, "retrieve_shamirs_secret_supernode_pvtkey", { - private_key_chunk: res + + backup_server_db_instance.backup_readDB("supernode_private_key_chunks", res_obj.params[0].chunk_val) + .then(function (res) { + if (typeof res=="object") { + let send_pvtkey_req = RM_RPC + .send_rpc + .call(this, "retrieve_shamirs_secret_supernode_pvtkey", { + private_key_chunk: res + }); + } else { + let send_pvtkey_req = RM_RPC + .send_rpc + .call(this, "retrieve_shamirs_secret_supernode_pvtkey", ""); + } + localbitcoinplusplus.kademlia.determineClosestSupernode(res_obj.globalParams.senderFloId) + .then(my_closest_su=>{ + send_pvtkey_req.globalParams.primarySupernode = my_closest_su[0].data.id; + doSend(send_pvtkey_req); + return; }); - } else { - let send_pvtkey_req = RM_RPC - .send_rpc - .call(this, "retrieve_shamirs_secret_supernode_pvtkey", ""); - } - localbitcoinplusplus.kademlia.determineClosestSupernode(res_obj.globalParams.senderFloId) - .then(my_closest_su=>{ - send_pvtkey_req.globalParams.primarySupernode = my_closest_su[0].data.id; - doSend(send_pvtkey_req); - return; }); }); } @@ -17266,23 +17426,24 @@ showMessage(backup_db_error_msg); throw new Error(backup_db_error_msg); }; - }); - - backup_server_db_instance.backup_readDB("supernode_private_key_chunks", res_obj.params[0].chunk_val).then(function ( + + backup_server_db_instance.backup_readDB("supernode_private_key_chunks", res_obj.params[0].chunk_val).then(function ( res) { - let send_pvtkey_req = RM_RPC - .send_rpc - .call(this, "retrieve_shamirs_secret_btc_pvtkey", { - retrieve_pvtkey_req_id: res_obj.params[0].retrieve_pvtkey_req_id, - private_key_chunk: res, - withdraw_id: res_obj.params[0].withdraw_id - }); - localbitcoinplusplus.kademlia.determineClosestSupernode(res_obj.globalParams.senderFloId) - .then(my_closest_su=>{ - send_pvtkey_req.globalParams.primarySupernode = my_closest_su[0].data.id; - doSend(send_pvtkey_req); - return; - }); + let send_pvtkey_req = RM_RPC + .send_rpc + .call(this, "retrieve_shamirs_secret_btc_pvtkey", { + retrieve_pvtkey_req_id: res_obj.params[0].retrieve_pvtkey_req_id, + private_key_chunk: res, + withdraw_id: res_obj.params[0].withdraw_id + }); + localbitcoinplusplus.kademlia.determineClosestSupernode(res_obj.globalParams.senderFloId) + .then(my_closest_su=>{ + //if(typeof send_pvtkey_req.globalParams !== "object") send_pvtkey_req.globalParams = []; + //send_pvtkey_req.globalParams.primarySupernode = my_closest_su[0].data.id; + doSend(send_pvtkey_req); + return; + }); + }); }); } break; @@ -17303,6 +17464,7 @@ delete res_obj.params[0].private_key_chunk; res_obj.params[0].btc_private_key_array = JSON.stringify(btc_pvt_arr[ retrieve_pvtkey_req_id]); + res_obj.params[0].trader_flo_address = localbitcoinplusplus.wallets.my_local_flo_address; RM_RPC.backup_receive_rpc_response.call(this, JSON.stringify(res_obj)); btc_pvt_arr[retrieve_pvtkey_req_id] = []; // Unset the object } @@ -17347,128 +17509,130 @@ showMessage(backup_db_error_msg); throw new Error(backup_db_error_msg); }; - }); - backup_server_db_instance.backup_readDB("withdraw_cash", withdraw_order_id).then(async function ( + backup_server_db_instance.backup_readDB("withdraw_cash", withdraw_order_id).then(async function ( withdraw_data) { - if (typeof withdraw_data == "object") { - if (withdraw_data.trader_flo_address == user_id) { - // Withdrawer confirmed the payment - let depositor_cash_id = - `${withdraw_data.depositor_flo_id}_${withdraw_data.currency}`; - let withdrawer_cash_id = - `${withdraw_data.trader_flo_address}_${withdraw_data.currency}`; + if (typeof withdraw_data == "object") { + if (withdraw_data.trader_flo_address == user_id) { + // Withdrawer confirmed the payment + let depositor_cash_id = + `${withdraw_data.depositor_flo_id}_${withdraw_data.currency}`; + let withdrawer_cash_id = + `${withdraw_data.trader_flo_address}_${withdraw_data.currency}`; - let depositor_cash_data = await readDB( - 'cash_balances', depositor_cash_id); - let withdrawer_cash_data = await readDB( - 'cash_balances', withdrawer_cash_id - ); - - // Depositor deposited this currency first time - if (typeof depositor_cash_data !== "object" || - typeof depositor_cash_data == - "undefined") { - depositor_cash_data = { - id: depositor_cash_id, - cash_balance: 0, - trader_flo_address: withdraw_data - .depositor_flo_id, - currency: withdraw_data.currency - }; - backup_server_db_instance.backup_addDB('cash_balances', - depositor_cash_data); - } - if (typeof depositor_cash_data == "object" && - typeof withdrawer_cash_data == "object" - ) { - depositor_cash_data.cash_balance += - parseFloat(withdraw_data.withdraw_amount); - withdrawer_cash_data.cash_balance -= - parseFloat(withdraw_data.withdraw_amount); - backup_server_db_instance.backup_updateinDB('cash_balances', - depositor_cash_data); - backup_server_db_instance.backup_updateinDB('cash_balances', - withdrawer_cash_data); - backup_server_db_instance.backup_removeByIndex('deposit', - 'trader_flo_address', - depositor_cash_data.trader_flo_address + let depositor_cash_data = await readDB( + 'cash_balances', depositor_cash_id); + let withdrawer_cash_data = await readDB( + 'cash_balances', withdrawer_cash_id ); - backup_server_db_instance.backup_removeinDB('withdraw_cash', - withdraw_data.id); - let update_cash_balance_obj = { - depositor_cash_data: depositor_cash_data, - withdrawer_cash_data: withdrawer_cash_data + // Depositor deposited this currency first time + if (typeof depositor_cash_data !== "object" || + typeof depositor_cash_data == + "undefined") { + depositor_cash_data = { + id: depositor_cash_id, + cash_balance: 0, + trader_flo_address: withdraw_data + .depositor_flo_id, + currency: withdraw_data.currency + }; + backup_server_db_instance.backup_addDB('cash_balances', + depositor_cash_data); } - let update_cash_balance_str = JSON.stringify( - update_cash_balance_obj); - let update_cash_balance_hash = Crypto.SHA256( - update_cash_balance_str); - let update_cash_balance_sign = + if (typeof depositor_cash_data == "object" && + typeof withdrawer_cash_data == "object" + ) { + depositor_cash_data.cash_balance += + parseFloat(withdraw_data.withdraw_amount); + withdrawer_cash_data.cash_balance -= + parseFloat(withdraw_data.withdraw_amount); + backup_server_db_instance.backup_updateinDB('cash_balances', + depositor_cash_data); + backup_server_db_instance.backup_updateinDB('cash_balances', + withdrawer_cash_data); + backup_server_db_instance.backup_removeByIndex('deposit', + 'trader_flo_address', + depositor_cash_data.trader_flo_address + ); + backup_server_db_instance.backup_removeinDB('withdraw_cash', + withdraw_data.id); + + let update_cash_balance_obj = { + depositor_cash_data: depositor_cash_data, + withdrawer_cash_data: withdrawer_cash_data + } + let update_cash_balance_str = JSON.stringify( + update_cash_balance_obj); + let update_cash_balance_hash = Crypto.SHA256( + update_cash_balance_str); + let update_cash_balance_sign = + RM_WALLET + .sign(update_cash_balance_hash, + localbitcoinplusplus.wallets.MY_SUPERNODE_PRIVATE_KEY + ); + + update_cash_balance_obj.publicKey = + localbitcoinplusplus.wallets.my_local_flo_public_key; + update_cash_balance_obj.sign = + update_cash_balance_sign; + update_cash_balance_obj.hash = + update_cash_balance_hash; + update_cash_balance_obj.withdraw_id = + withdraw_data.id; + + update_cash_balance_obj.receiver_flo_address = user_id; + + let update_cash_balance_req = RM_RPC + .send_rpc + .call(this, + "update_all_deposit_withdraw_success", + update_cash_balance_obj); + doSend(update_cash_balance_req); + } + } + else if (withdraw_data.depositor_flo_id == user_id) { + // Depositor claimed to deposit the cash + withdraw_data.status = 3; + backup_server_db_instance.backup_updateinDB('withdraw_cash', withdraw_data, + withdraw_data.id); + let update_withdraw_cash_obj_data = { + depositor_claim: withdraw_data + }; + let update_withdraw_cash_obj_data_str = + JSON.stringify( + update_withdraw_cash_obj_data); + let update_withdraw_cash_obj_data_hash = + Crypto.SHA256( + update_withdraw_cash_obj_data_str); + let update_withdraw_cash_obj_data_sign = RM_WALLET - .sign(update_cash_balance_hash, + .sign( + update_withdraw_cash_obj_data_hash, localbitcoinplusplus.wallets.MY_SUPERNODE_PRIVATE_KEY ); - - update_cash_balance_obj.publicKey = + update_withdraw_cash_obj_data.hash = + update_withdraw_cash_obj_data_hash; + update_withdraw_cash_obj_data.sign = + update_withdraw_cash_obj_data_sign; + update_withdraw_cash_obj_data.publicKey = localbitcoinplusplus.wallets.my_local_flo_public_key; - update_cash_balance_obj.sign = - update_cash_balance_sign; - update_cash_balance_obj.hash = - update_cash_balance_hash; - update_cash_balance_obj.withdraw_id = - withdraw_data.id; + + update_withdraw_cash_obj_data.receiver_flo_address = user_id; - update_cash_balance_obj.receiver_flo_address = user_id; - - let update_cash_balance_req = RM_RPC + let update_withdraw_cash_obj = RM_RPC .send_rpc .call(this, - "update_all_deposit_withdraw_success", - update_cash_balance_obj); - doSend(update_cash_balance_req); - } + "update_all_withdraw_cash_depositor_claim", + update_withdraw_cash_obj_data); + doSend(update_withdraw_cash_obj); + } + return true; } - else if (withdraw_data.depositor_flo_id == user_id) { - // Depositor claimed to deposit the cash - withdraw_data.status = 3; - backup_server_db_instance.backup_updateinDB('withdraw_cash', withdraw_data, - withdraw_data.id); - let update_withdraw_cash_obj_data = { - depositor_claim: withdraw_data - }; - let update_withdraw_cash_obj_data_str = - JSON.stringify( - update_withdraw_cash_obj_data); - let update_withdraw_cash_obj_data_hash = - Crypto.SHA256( - update_withdraw_cash_obj_data_str); - let update_withdraw_cash_obj_data_sign = - RM_WALLET - .sign( - update_withdraw_cash_obj_data_hash, - localbitcoinplusplus.wallets.MY_SUPERNODE_PRIVATE_KEY - ); - update_withdraw_cash_obj_data.hash = - update_withdraw_cash_obj_data_hash; - update_withdraw_cash_obj_data.sign = - update_withdraw_cash_obj_data_sign; - update_withdraw_cash_obj_data.publicKey = - localbitcoinplusplus.wallets.my_local_flo_public_key; - - update_withdraw_cash_obj_data.receiver_flo_address = user_id; + }); + }); - let update_withdraw_cash_obj = RM_RPC - .send_rpc - .call(this, - "update_all_withdraw_cash_depositor_claim", - update_withdraw_cash_obj_data); - doSend(update_withdraw_cash_obj); - } - return true; - } - }); + } }); @@ -17565,10 +17729,9 @@ showMessage(backup_db_error_msg); throw new Error(backup_db_error_msg); }; + backup_server_db_instance.backup_addDB('userPublicData', public_req_object); }); - backup_server_db_instance.backup_addDB('userPublicData', public_req_object); - } } catch (error) { throw new Error('Invalid public key and flo address combination.'); @@ -17598,14 +17761,13 @@ showMessage(backup_db_error_msg); throw new Error(backup_db_error_msg); }; - }); - - backup_server_db_instance.backup_readDBbyIndex("deposit", 'status', 1).then(function (res) { - res.map(function (deposit_trade) { - if (localbitcoinplusplus.master_configurations.tradableAsset1 - .includes(deposit_trade.product)) { - validateDepositedBTCBalance(deposit_trade, res_obj.params[0].trader_flo_address); - } + backup_server_db_instance.backup_readDBbyIndex("deposit", 'status', 1).then(function (res) { + res.map(function (deposit_trade) { + if (localbitcoinplusplus.master_configurations.tradableAsset1 + .includes(deposit_trade.product)) { + validateDepositedBTCBalance(deposit_trade, res_obj.params[0].trader_flo_address); + } + }); }); }); }); @@ -17632,18 +17794,36 @@ showMessage(backup_db_error_msg); throw new Error(backup_db_error_msg); }; - }); - if (typeof update_script_request.file_to_update == "string") { + if (typeof update_script_request.file_to_update == "string") { - backup_server_db_instance.backup_readDB("external_files", update_script_request.file_to_update).then( - file_details => { - if (typeof file_details !== "undefined" - && typeof file_details.content == "string" && file_details - .content.length > 0) { - let file_details_string = JSON.stringify(file_details); + backup_server_db_instance.backup_readDB("external_files", update_script_request.file_to_update).then( + file_details => { + if (typeof file_details !== "undefined" + && typeof file_details.content == "string" && file_details + .content.length > 0) { + let file_details_string = JSON.stringify(file_details); + let server_sign = RM_WALLET + .sign(file_details_string, localbitcoinplusplus.wallets + .MY_SUPERNODE_PRIVATE_KEY); + response_from_sever = RM_RPC.send_rpc + .call(this, "update_external_file_server_response", { + trader_flo_address: update_script_request.trader_flo_address, + file_updated: file_details, + server_sign: server_sign, + server_pubkey: server_pubkey, + filename: update_script_request.file_to_update, + receiver_flo_address: update_script_request.trader_flo_address + }); + doSend(response_from_sever); + } + }); + } else { + backup_server_db_instance.backup_readAllDB("external_files").then(file_details => { + if (file_details.length > 0) { + let file_details_str = JSON.stringify(file_details); let server_sign = RM_WALLET - .sign(file_details_string, localbitcoinplusplus.wallets + .sign(file_details_str, localbitcoinplusplus.wallets .MY_SUPERNODE_PRIVATE_KEY); response_from_sever = RM_RPC.send_rpc .call(this, "update_external_file_server_response", { @@ -17651,32 +17831,15 @@ file_updated: file_details, server_sign: server_sign, server_pubkey: server_pubkey, - filename: update_script_request.file_to_update, - receiver_flo_address: update_script_request.trader_flo_address + filename: "UPDATE_ALL_FILES", + receiver_flo_address: update_script_request.trader_flo_address, }); doSend(response_from_sever); } }); - } else { - backup_server_db_instance.backup_readAllDB("external_files").then(file_details => { - if (file_details.length > 0) { - let file_details_str = JSON.stringify(file_details); - let server_sign = RM_WALLET - .sign(file_details_str, localbitcoinplusplus.wallets - .MY_SUPERNODE_PRIVATE_KEY); - response_from_sever = RM_RPC.send_rpc - .call(this, "update_external_file_server_response", { - trader_flo_address: update_script_request.trader_flo_address, - file_updated: file_details, - server_sign: server_sign, - server_pubkey: server_pubkey, - filename: "UPDATE_ALL_FILES", - receiver_flo_address: update_script_request.trader_flo_address, - }); - doSend(response_from_sever); - } - }); - } + } + }); + }); break; @@ -17700,9 +17863,8 @@ showMessage(backup_db_error_msg); throw new Error(backup_db_error_msg); }; - }); - - let SuPubKey = backup_server_db_instance.backup_readDB('userPublicData', updateUserCryptoBalanceResponseObject.trader_flo_address) + + let SuPubKey = backup_server_db_instance.backup_readDB('userPublicData', updateUserCryptoBalanceResponseObject.trader_flo_address) .then(user_data => { if (typeof user_data !== "object" || user_data.supernode_flo_public_key.length < 1) @@ -17726,6 +17888,8 @@ showMessage(`WARNING: Failed to update balance in your DB. Please refresh.`); } }); + }); + break; case "addNewKbucketNode": @@ -18896,6 +19060,14 @@ async backup_updateinDB(tablename, Obj, key) { try { + if(typeof Obj.vectorClock == "undefined") { + Obj.vectorClock = 0; + } else if(typeof Obj.increaseVectorClock == "boolean" + && Obj.increaseVectorClock === false) { + // leave the vector clock field unchanged + } else { + Obj.vectorClock += 1; + } this.request = this.db.transaction([tablename], "readwrite") let store = this.request.objectStore(tablename) await store.put(Obj);