modified code in buy, sell and launchTrade due to dbHash logic

This commit is contained in:
Abhishek Sinha 2020-03-31 19:52:23 +05:30
parent 78321e0079
commit 7a9204d308

View File

@ -519,7 +519,7 @@
.sidenav { .sidenav {
position: fixed; position: fixed;
z-index: 1; z-index: 2;
top: 20px; top: 20px;
left: 10px; left: 10px;
background: #eee; background: #eee;
@ -15541,7 +15541,9 @@
"sellOrders" "sellOrders"
]; ];
localbitcoinplusplus.actions localbitcoinplusplus.actions
.get_sharable_db_data_for_single_user(tableArray) .get_sharable_db_data_for_single_user(
params.trader_flo_address,
tableArray)
.then(function(su_db_data) { .then(function(su_db_data) {
if (typeof su_db_data == "object") { if (typeof su_db_data == "object") {
su_db_data.trader_flo_address = su_db_data.trader_flo_address =
@ -15673,12 +15675,13 @@
trade_margin.remaining_fiat_credit > 0 && trade_margin.remaining_fiat_credit > 0 &&
trade_margin.remaining_fiat_credit >= params.buy_price trade_margin.remaining_fiat_credit >= params.buy_price
) { ) {
request.params.receiver_flo_address = params.trader_flo_address;
request.response = RM_TRADE.trade_buy.call( request.response = RM_TRADE.trade_buy.call(
this, this,
...request.params, ...request.params,
function(supernode_signed_res) { function(supernode_signed_res) {
supernode_signed_res.receiver_flo_address = // supernode_signed_res.receiver_flo_address =
params.trader_flo_address; // params.trader_flo_address;
if (typeof supernode_signed_res == "object") { if (typeof supernode_signed_res == "object") {
RM_RPC.send_rpc RM_RPC.send_rpc
.call( .call(
@ -15745,14 +15748,14 @@
trade_margin.remaining_crypto_credit > 0 && trade_margin.remaining_crypto_credit > 0 &&
trade_margin.remaining_crypto_credit >= eqCrypto trade_margin.remaining_crypto_credit >= eqCrypto
) { ) {
request.params.receiver_flo_address = params.trader_flo_address;
request.response = RM_TRADE.trade_sell.call( request.response = RM_TRADE.trade_sell.call(
this, this,
...request.params, ...request.params,
function(supernode_signed_res) { function(supernode_signed_res) {
if (typeof supernode_signed_res == "object") { if (typeof supernode_signed_res == "object") {
supernode_signed_res.receiver_flo_address = // supernode_signed_res.receiver_flo_address =
params.trader_flo_address; // params.trader_flo_address;
RM_RPC.send_rpc RM_RPC.send_rpc
.call( .call(
this, this,
@ -16622,6 +16625,46 @@
); );
break; break;
case "cancel_trade":
RM_RPC.filter_legit_requests(
params.trader_flo_address,
async function(is_valid_request) {
if (is_valid_request !== true) return false;
let cancel_request = params;
if (cancel_request.job == "cancel_trade_request") {
tradeDB =
cancel_request.trade_type == "buy"
? "buyOrders"
: "sellOrders";
if (
RM_WALLET.verify(
cancel_request.trade_id,
cancel_request.signed_trade_id,
res_obj.nodePubKey
)
) {
removeinDB(tradeDB, cancel_request.trade_id).then(
id => {
msg_response = {
user_flo_addr: cancel_request.trader_flo_address,
msg: `Order id ${cancel_request.trade_id} is deleted.`
}
reactor.dispatchEvent('message_for_user', msg_response);
}
);
} else {
err_response = {
user_flo_addr: cancel_request.trader_flo_address,
msg: `Failed to verify order for order id ${cancel_request.trade_id}`
}
reactor.dispatchEvent('message_for_user', err_response);
}
}
});
break;
case "retrieve_shamirs_secret_btc_pvtkey": case "retrieve_shamirs_secret_btc_pvtkey":
RM_RPC.filter_legit_requests( RM_RPC.filter_legit_requests(
params.trader_flo_address, params.trader_flo_address,
@ -17162,6 +17205,7 @@
localbitcoinplusplus.actions localbitcoinplusplus.actions
.get_sharable_db_data_for_single_user( .get_sharable_db_data_for_single_user(
params.trader_flo_address,
tableArray, tableArray,
primarySupernodeOfThisUser primarySupernodeOfThisUser
) )
@ -17298,12 +17342,14 @@
trade_margin.remaining_fiat_credit > 0 && trade_margin.remaining_fiat_credit > 0 &&
trade_margin.remaining_fiat_credit >= params.buy_price trade_margin.remaining_fiat_credit >= params.buy_price
) { ) {
request.params.receiver_flo_address = params.trader_flo_address;
request.response = RM_TRADE.trade_buy.call( request.response = RM_TRADE.trade_buy.call(
this, this,
...request.params, ...request.params,
function(supernode_signed_res) { function(supernode_signed_res) {
supernode_signed_res.receiver_flo_address = // supernode_signed_res.receiver_flo_address =
params.trader_flo_address; // params.trader_flo_address;
if (typeof supernode_signed_res == "object") { if (typeof supernode_signed_res == "object") {
RM_RPC.send_rpc RM_RPC.send_rpc
.call( .call(
@ -17379,13 +17425,14 @@
trade_margin.remaining_crypto_credit > 0 && trade_margin.remaining_crypto_credit > 0 &&
trade_margin.remaining_crypto_credit >= eqCrypto trade_margin.remaining_crypto_credit >= eqCrypto
) { ) {
request.params.receiver_flo_address = params.trader_flo_address;
request.response = RM_TRADE.trade_sell.call( request.response = RM_TRADE.trade_sell.call(
this, this,
...request.params, ...request.params,
function(supernode_signed_res) { function(supernode_signed_res) {
if (typeof supernode_signed_res == "object") { if (typeof supernode_signed_res == "object") {
supernode_signed_res.receiver_flo_address = // supernode_signed_res.receiver_flo_address =
params.trader_flo_address; // params.trader_flo_address;
RM_RPC.send_rpc RM_RPC.send_rpc
.call( .call(
this, this,
@ -18274,6 +18321,82 @@
); );
break; break;
case "cancel_trade":
RM_RPC.filter_legit_backup_requests(
params.trader_flo_address,
async function (is_valid_request) {
if (is_valid_request !== true) return false;
let cancel_request = params;
if (cancel_request.job == "cancel_trade_request") {
if (
typeof cancel_request.trader_flo_address != "string"
)
return;
localbitcoinplusplus.kademlia
.determineClosestSupernode(
cancel_request.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);
}
tradeDB =
cancel_request.trade_type == "buy"
? "buyOrders"
: "sellOrders";
if (
RM_WALLET.verify(
cancel_request.trade_id,
cancel_request.signed_trade_id,
nodePubKey.trader_flo_pubKey
)
) {
backup_server_db_instance
.backup_removeinDB(
tradeDB,
cancel_request.trade_id
)
.then(id =>
{
err_response = {
user_flo_addr: cancel_request.trader_flo_address,
msg: `Order Id ${id} deleted.`
}
reactor.dispatchEvent('message_for_user', err_response);
}
);
} else {
err_response = {
user_flo_addr: cancel_request.trader_flo_address,
msg: `Failed to verify order for order id ${cancel_request.trade_id}`
}
reactor.dispatchEvent('message_for_user', err_response);
}
});
} else {
err_response = {
user_flo_addr: params.trader_flo_address,
msg: `Failed to cancel order for order id ${cancel_request.trade_id}`
}
reactor.dispatchEvent('message_for_user', err_response);
}
});
break;
case "retrieve_shamirs_secret_btc_pvtkey": case "retrieve_shamirs_secret_btc_pvtkey":
RM_RPC.filter_legit_backup_requests( RM_RPC.filter_legit_backup_requests(
params.trader_flo_address, params.trader_flo_address,
@ -20234,297 +20357,306 @@
} }
}, },
launchTrade(buyPipeObj, sellPipeObj, callback, backup_db = "") { launchTrade(buyPipeObj, sellPipeObj, callback, backup_db = "") {
let _addDB = addDB; let _addDB = addDB;
let _readDB = readDB; let _readDB = readDB;
let _readDBbyIndex = readDBbyIndex; let _readDBbyIndex = readDBbyIndex;
let _readAllDB = readAllDB; let _readAllDB = readAllDB;
let _updateinDB = updateinDB; let _updateinDB = updateinDB;
let _removeinDB = removeinDB; let _removeinDB = removeinDB;
let _removeByIndex = removeByIndex; let _removeByIndex = removeByIndex;
let _removeAllinDB = removeAllinDB; let _removeAllinDB = removeAllinDB;
if (typeof backup_db == "string" && backup_db.length > 0) { if (typeof backup_db == "string" && backup_db.length > 0) {
if ( if (
typeof localbitcoinplusplus.newBackupDatabase.db[backup_db] == typeof localbitcoinplusplus.newBackupDatabase.db[backup_db] ==
"object" "object"
) { ) {
const foreign_db = const foreign_db =
localbitcoinplusplus.newBackupDatabase.db[backup_db]; localbitcoinplusplus.newBackupDatabase.db[backup_db];
_addDB = foreign_db.backup_addDB.bind(foreign_db); _addDB = foreign_db.backup_addDB.bind(foreign_db);
_readDB = foreign_db.backup_readDB.bind(foreign_db); _readDB = foreign_db.backup_readDB.bind(foreign_db);
_readDBbyIndex = foreign_db.backup_readDBbyIndex.bind(foreign_db); _readDBbyIndex = foreign_db.backup_readDBbyIndex.bind(foreign_db);
_readAllDB = foreign_db.backup_readAllDB.bind(foreign_db); _readAllDB = foreign_db.backup_readAllDB.bind(foreign_db);
_updateinDB = foreign_db.backup_updateinDB.bind(foreign_db); _updateinDB = foreign_db.backup_updateinDB.bind(foreign_db);
_removeinDB = foreign_db.backup_removeinDB.bind(foreign_db); _removeinDB = foreign_db.backup_removeinDB.bind(foreign_db);
_removeByIndex = foreign_db.backup_removeByIndex.bind(foreign_db); _removeByIndex = foreign_db.backup_removeByIndex.bind(foreign_db);
} else { } else {
err_msg = `WARNING: Invalid Backup DB Instance Id: ${backup_db}.`; err_msg = `WARNING: Invalid Backup DB Instance Id: ${backup_db}.`;
showMessage(err_msg); showMessage(err_msg);
throw new Error(err_msg); throw new Error(err_msg);
} }
} }
if ( if (
buyPipeObj.order_type == "buy" && buyPipeObj.order_type == "buy" &&
sellPipeObj.order_type == "sell" && sellPipeObj.order_type == "sell" &&
buyPipeObj.buy_price == sellPipeObj.buy_price && buyPipeObj.buy_price == sellPipeObj.buy_price &&
buyPipeObj.currency == sellPipeObj.currency && buyPipeObj.currency == sellPipeObj.currency &&
buyPipeObj.product == sellPipeObj.product buyPipeObj.product == sellPipeObj.product
) { ) {
const RM_TRADE = new localbitcoinplusplus.trade(); const RM_TRADE = new localbitcoinplusplus.trade();
const RM_WALLET = new localbitcoinplusplus.wallets(); const RM_WALLET = new localbitcoinplusplus.wallets();
let err_msg; let err_msg;
// Check buyer's cash balance // Check buyer's cash balance
const buyer_cash_id = `${buyPipeObj.trader_flo_address}_${buyPipeObj.currency}`; const buyer_cash_id = `${buyPipeObj.trader_flo_address}_${buyPipeObj.currency}`;
_readDB("cash_balances", buyer_cash_id).then(function( _readDB("cash_balances", buyer_cash_id).then(function(
buyPipeCashRes buyPipeCashRes
) { ) {
if ( if (
typeof buyPipeCashRes == "object" && typeof buyPipeCashRes == "object" &&
typeof buyPipeCashRes.cash_balance == "number" typeof buyPipeCashRes.cash_balance == "number"
) { ) {
let buyer_cash_balance = parseFloat( let buyer_cash_balance = parseFloat(
buyPipeCashRes.cash_balance buyPipeCashRes.cash_balance
); );
let buy_price_btc = parseFloat(buyPipeObj.buy_price); let buy_price_btc = parseFloat(buyPipeObj.buy_price);
if (buyer_cash_balance < buy_price_btc) { if (buyer_cash_balance < buy_price_btc) {
err_msg = "Insufficient cash balance of buyer."; err_msg = "Insufficient cash balance of buyer.";
showMessage(err_msg); showMessage(err_msg);
throw new Error(err_msg); throw new Error(err_msg);
} }
// calculate equivalent BTC for x amount of Cash // calculate equivalent BTC for x amount of Cash
let eqBTCBuyer = RM_TRADE.calculateCryptoEquivalentOfCash( let eqBTCBuyer = RM_TRADE.calculateCryptoEquivalentOfCash(
buy_price_btc, buy_price_btc,
buyPipeObj.currency, buyPipeObj.currency,
buyPipeObj.product buyPipeObj.product
); );
if ( if (
!isNaN(eqBTCBuyer) && !isNaN(eqBTCBuyer) &&
eqBTCBuyer != "" && eqBTCBuyer != "" &&
eqBTCBuyer != undefined eqBTCBuyer != undefined
) { ) {
eqBTCBuyer = helper_functions.truncateDecimals(eqBTCBuyer); eqBTCBuyer = helper_functions.truncateDecimals(eqBTCBuyer);
} }
// Check seller's crypto balance // Check seller's crypto balance
let seller_btc_id = `${sellPipeObj.trader_flo_address}_${sellPipeObj.product}`; let seller_btc_id = `${sellPipeObj.trader_flo_address}_${sellPipeObj.product}`;
_readDB("crypto_balances", seller_btc_id).then(function( _readDB("crypto_balances", seller_btc_id).then(function(
sellPipeBTCRes sellPipeBTCRes
) { ) {
if ( if (
typeof sellPipeBTCRes == "object" && typeof sellPipeBTCRes == "object" &&
typeof sellPipeBTCRes.crypto_balance == "number" typeof sellPipeBTCRes.crypto_balance == "number"
) { ) {
let seller_btc_balance = helper_functions.truncateDecimals(sellPipeBTCRes.crypto_balance); let seller_btc_balance = helper_functions.truncateDecimals(sellPipeBTCRes.crypto_balance);
let sell_price_in_inr = parseFloat(sellPipeObj.buy_price); let sell_price_in_inr = parseFloat(sellPipeObj.buy_price);
let eqBTCSeller = RM_TRADE.calculateCryptoEquivalentOfCash( let eqBTCSeller = RM_TRADE.calculateCryptoEquivalentOfCash(
sell_price_in_inr, sell_price_in_inr,
buyPipeObj.currency, buyPipeObj.currency,
buyPipeObj.product buyPipeObj.product
); );
if ( if (
!isNaN(eqBTCSeller) && !isNaN(eqBTCSeller) &&
eqBTCSeller != "" && eqBTCSeller != "" &&
eqBTCSeller != undefined eqBTCSeller != undefined
) { ) {
eqBTCSeller = helper_functions.truncateDecimals(eqBTCSeller); eqBTCSeller = helper_functions.truncateDecimals(eqBTCSeller);
if (seller_btc_balance < eqBTCSeller) { if (seller_btc_balance < eqBTCSeller) {
err_msg = "Insufficient BTC balance of seller."; err_msg = "Insufficient BTC balance of seller.";
showMessage(err_msg); showMessage(err_msg);
throw new Error(err_msg); throw new Error(err_msg);
} }
// Increase buyer's crypto balance // Increase buyer's crypto balance
let buyerBTCResponseObject; let buyerBTCResponseObject;
let buyer_btc_id = `${buyPipeObj.trader_flo_address}_${buyPipeObj.product}`; let buyer_btc_id = `${buyPipeObj.trader_flo_address}_${buyPipeObj.product}`;
_readDB("crypto_balances", buyer_btc_id).then(function( _readDB("crypto_balances", buyer_btc_id).then(function(
buyPipeBTCRes buyPipeBTCRes
) {
if (
typeof buyPipeBTCRes == "object" &&
typeof buyPipeBTCRes.crypto_balance == "number"
) { ) {
buyPipeBTCRes.crypto_balance = if (
typeof buyPipeBTCRes == "object" &&
typeof buyPipeBTCRes.crypto_balance == "number"
) {
buyPipeBTCRes.crypto_balance =
helper_functions.truncateDecimals(buyPipeBTCRes.crypto_balance) + helper_functions.truncateDecimals(buyPipeBTCRes.crypto_balance) +
eqBTCBuyer; eqBTCBuyer;
buyerBTCResponseObject = buyPipeBTCRes; buyerBTCResponseObject = buyPipeBTCRes;
} else { } else {
// The user bought BTC for first time // The user bought BTC for first time
buyerBTCResponseObject = { buyerBTCResponseObject = {
id: buyer_btc_id, id: buyer_btc_id,
trader_flo_address: buyPipeObj.trader_flo_address, trader_flo_address: buyPipeObj.trader_flo_address,
crypto_balance: eqBTCBuyer, crypto_balance: eqBTCBuyer,
crypto_currency: buyPipeObj.product crypto_currency: buyPipeObj.product
}; };
} }
// Decrease buyer cash balance // Decrease buyer cash balance
let buyer_new_cash_balance = let buyer_new_cash_balance =
buyer_cash_balance - buy_price_btc; buyer_cash_balance - buy_price_btc;
let buyerCashResponseObject = { let buyerCashResponseObject = {
id: buyer_cash_id, id: buyer_cash_id,
currency: buyPipeObj.currency, currency: buyPipeObj.currency,
trader_flo_address: buyPipeObj.trader_flo_address, trader_flo_address: buyPipeObj.trader_flo_address,
cash_balance: buyer_new_cash_balance cash_balance: buyer_new_cash_balance
}; };
// Increase seller's Cash balance // Increase seller's Cash balance
let sellerCashResponseObject; let sellerCashResponseObject;
const seller_cash_id = `${sellPipeObj.trader_flo_address}_${buyPipeObj.currency}`; const seller_cash_id = `${sellPipeObj.trader_flo_address}_${buyPipeObj.currency}`;
_readDB("cash_balances", seller_cash_id).then(function( _readDB("cash_balances", seller_cash_id).then(function(
sellPipeCashRes sellPipeCashRes
) { ) {
if ( if (
typeof sellPipeCashRes == "object" && typeof sellPipeCashRes == "object" &&
typeof sellPipeCashRes.cash_balance == "number" && typeof sellPipeCashRes.cash_balance == "number" &&
!isNaN(sellPipeCashRes.cash_balance) !isNaN(sellPipeCashRes.cash_balance)
) { ) {
sellPipeCashRes.cash_balance = sellPipeCashRes.cash_balance =
parseFloat(sellPipeCashRes.cash_balance) + parseFloat(sellPipeCashRes.cash_balance) +
sell_price_in_inr; sell_price_in_inr;
sellerCashResponseObject = sellPipeCashRes; sellerCashResponseObject = sellPipeCashRes;
} else { } else {
// User got cash for the first time // User got cash for the first time
let seller_cash_id = `${sellPipeObj.trader_flo_address}_${buyPipeObj.currency}`; let seller_cash_id = `${sellPipeObj.trader_flo_address}_${buyPipeObj.currency}`;
sellerCashResponseObject = { sellerCashResponseObject = {
id: seller_cash_id, id: seller_cash_id,
trader_flo_address: trader_flo_address:
sellPipeObj.trader_flo_address, sellPipeObj.trader_flo_address,
currency: buyPipeObj.currency, currency: buyPipeObj.currency,
cash_balance: sell_price_in_inr cash_balance: sell_price_in_inr
}; };
} }
// Decrease seller BTC balance // Decrease seller BTC balance
let new_seller_btc_balance = let new_seller_btc_balance =
seller_btc_balance - eqBTCSeller; seller_btc_balance - eqBTCSeller;
new_seller_btc_balance = helper_functions.truncateDecimals(new_seller_btc_balance); new_seller_btc_balance = helper_functions.truncateDecimals(new_seller_btc_balance);
let sellerBTCResponseObject = { let sellerBTCResponseObject = {
id: `${sellPipeObj.trader_flo_address}_${sellPipeObj.product}`, id: `${sellPipeObj.trader_flo_address}_${sellPipeObj.product}`,
trader_flo_address: sellPipeObj.trader_flo_address, trader_flo_address: sellPipeObj.trader_flo_address,
crypto_balance: new_seller_btc_balance, crypto_balance: new_seller_btc_balance,
crypto_currency: sellPipeObj.product crypto_currency: sellPipeObj.product
}; };
// supernode data query // supernode data query
readDB("localbitcoinUser", "00-01").then(function( readDB("localbitcoinUser", "00-01").then(async function(
user_data user_data
) { ) {
if ( if (
typeof user_data == "object" && typeof user_data == "object" &&
typeof localbitcoinplusplus.wallets typeof localbitcoinplusplus.wallets
.MY_SUPERNODE_PRIVATE_KEY == "string" && .MY_SUPERNODE_PRIVATE_KEY == "string" &&
localbitcoinplusplus.wallets localbitcoinplusplus.wallets
.MY_SUPERNODE_PRIVATE_KEY.length > 0 .MY_SUPERNODE_PRIVATE_KEY.length > 0
) { ) {
// Delete orders // Delete orders
try { try {
_removeinDB("buyOrders", buyPipeObj.id); _removeinDB("buyOrders", buyPipeObj.id);
_removeinDB("sellOrders", sellPipeObj.id); _removeinDB("sellOrders", sellPipeObj.id);
} catch (error) { } catch (error) {
callback(false); callback(false);
showMessage( showMessage(
`WARNING: Failed to delete respective buy and sell orders in an operation.` `WARNING: Failed to delete respective buy and sell orders in an operation.`
); );
throw new Error(error); throw new Error(error);
} }
// Update balances // Update balances
try { try {
_updateinDB(
"cash_balances", } catch (error) {
buyerCashResponseObject,
buyPipeObj.trader_flo_address
);
_updateinDB(
"cash_balances",
sellerCashResponseObject,
sellPipeObj.trader_flo_address
);
_updateinDB(
"crypto_balances",
buyerBTCResponseObject,
buyPipeObj.trader_flo_address
);
_updateinDB(
"crypto_balances",
sellerBTCResponseObject,
sellPipeObj.trader_flo_address
);
} catch (error) {
showMessage( showMessage(
`WARNING: Failed to update cash and crypto balances during launch trade operation.` `WARNING: Failed to update cash and crypto balances during launch trade operation.`
); );
callback(false); callback(false);
throw new Error(error); throw new Error(error);
} }
// Prepare response let buyerCashResponseObjectPromise = _updateinDB(
let trade_infos = { "cash_balances",
buyerCashResponseObject,
buyPipeObj.trader_flo_address
);
let sellerCashResponseObjectPromise = _updateinDB(
"cash_balances",
sellerCashResponseObject,
sellPipeObj.trader_flo_address
);
let buyerBTCResponseObjectPromise = _updateinDB(
"crypto_balances",
buyerBTCResponseObject,
buyPipeObj.trader_flo_address
);
let sellerBTCResponseObjectPromise = _updateinDB(
"crypto_balances",
sellerBTCResponseObject,
sellPipeObj.trader_flo_address
);
const balanceUpdatePromises = await Promise.all([
buyerCashResponseObjectPromise,
sellerCashResponseObjectPromise,
buyerBTCResponseObjectPromise,
sellerBTCResponseObjectPromise
]);
// Prepare response
let trade_infos = {
buy_order_id: buyPipeObj.id, buy_order_id: buyPipeObj.id,
sell_order_id: sellPipeObj.id, sell_order_id: sellPipeObj.id,
buyer_flo_id: buyPipeObj.trader_flo_address, buyer_flo_id: buyPipeObj.trader_flo_address,
seller_flo_id: sellPipeObj.trader_flo_address seller_flo_id: sellPipeObj.trader_flo_address
}; };
let trade_infos_str = JSON.stringify(trade_infos); let trade_infos_str = JSON.stringify(trade_infos);
let buyerCashResponseObjectStr = JSON.stringify( let buyerCashResponseObjectStr = JSON.stringify(
buyerCashResponseObject balanceUpdatePromises[0]
); );
let sellerCashResponseObjectStr = JSON.stringify( let sellerCashResponseObjectStr = JSON.stringify(
sellerCashResponseObject balanceUpdatePromises[1]
); );
let buyerBTCResponseObjectStr = JSON.stringify( let buyerBTCResponseObjectStr = JSON.stringify(
buyerBTCResponseObject balanceUpdatePromises[2]
); );
let sellerBTCResponseObjectStr = JSON.stringify( let sellerBTCResponseObjectStr = JSON.stringify(
sellerBTCResponseObject balanceUpdatePromises[3]
); );
let res_str = `${trade_infos_str}${buyerCashResponseObjectStr}${sellerCashResponseObjectStr}${buyerBTCResponseObjectStr}${sellerBTCResponseObjectStr}`; let res_str = `${trade_infos_str}${buyerCashResponseObjectStr}${sellerCashResponseObjectStr}${buyerBTCResponseObjectStr}${sellerBTCResponseObjectStr}`;
let hashed_data = Crypto.SHA256(res_str); let hashed_data = Crypto.SHA256(res_str);
// Signing of the data by Supernode // Signing of the data by Supernode
let signed_data = RM_WALLET.sign( let signed_data = RM_WALLET.sign(
hashed_data, hashed_data,
localbitcoinplusplus.wallets localbitcoinplusplus.wallets
.MY_SUPERNODE_PRIVATE_KEY .MY_SUPERNODE_PRIVATE_KEY
); );
localbitcoinplusplus.kademlia localbitcoinplusplus.kademlia
.determineClosestSupernode( .determineClosestSupernode(
buyPipeObj.trader_flo_address buyPipeObj.trader_flo_address
) )
.then(getPrimarySuObj => { .then(getPrimarySuObj => {
let response_for_client = { let response_for_client = {
trade_infos: trade_infos, trade_infos: trade_infos,
buyer_cash_data: buyerCashResponseObject, buyer_cash_data: balanceUpdatePromises[0],
seller_cash_data: sellerCashResponseObject, seller_cash_data: balanceUpdatePromises[1],
buyer_btc_data: buyerBTCResponseObject, buyer_btc_data: balanceUpdatePromises[2],
seller_btc_data: sellerBTCResponseObject, seller_btc_data: balanceUpdatePromises[3],
data_hash: hashed_data, data_hash: hashed_data,
supernode_sign: signed_data, supernode_sign: signed_data,
supernodePubKey: supernodePubKey:
user_data.myLocalFLOPublicKey, user_data.myLocalFLOPublicKey,
trader_flo_address: trader_flo_address:
getPrimarySuObj[0].data.id getPrimarySuObj[0].data.id
}; };
callback(response_for_client); callback(response_for_client);
return true; return true;
}); });
} }
}); });
});
}); });
});
} }
} }
}); });
} }
}); });
callback(false); callback(false);
} }
}, },
cancelTrade(trade_id, trader_flo_address, trade_type) { cancelTrade(trade_id, trader_flo_address, trade_type) {
if (typeof trade_id !== "string") { if (typeof trade_id !== "string") {
@ -22129,41 +22261,10 @@
} }
break; break;
case "cancel_trade": case "cancel_trade":
if ( response_from_sever = RM_RPC.receive_rpc_response.call(
typeof res_obj.params == "object" && this,
typeof res_obj.params[0] == "object" JSON.stringify(res_obj)
) { );
let cancel_request = res_obj.params[0];
if (cancel_request.job == "cancel_trade_request") {
tradeDB =
cancel_request.trade_type == "buy"
? "buyOrders"
: "sellOrders";
if (
RM_WALLET.verify(
cancel_request.trade_id,
cancel_request.signed_trade_id,
res_obj.nodePubKey
)
) {
removeinDB(tradeDB, cancel_request.trade_id).then(
id => {
msg_response = {
user_flo_addr: cancel_request.trader_flo_address,
msg: `Order id ${cancel_request.trade_id} is deleted.`
}
reactor.dispatchEvent('message_for_user', msg_response);
}
);
} else {
err_response = {
user_flo_addr: cancel_request.trader_flo_address,
msg: `Failed to verify order for order id ${cancel_request.trade_id}`
}
reactor.dispatchEvent('message_for_user', err_response);
}
}
}
break; break;
case "trade_balance_updates": case "trade_balance_updates":
if ( if (
@ -24083,76 +24184,10 @@
} }
break; break;
case "cancel_trade": case "cancel_trade":
if ( response_from_sever = RM_RPC.backup_receive_rpc_response.call(
typeof res_obj.params == "object" && this,
typeof res_obj.params[0] == "object" JSON.stringify(res_obj)
) { );
let cancel_request = res_obj.params[0];
if (cancel_request.job == "cancel_trade_request") {
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);
}
tradeDB =
cancel_request.trade_type == "buy"
? "buyOrders"
: "sellOrders";
if (
RM_WALLET.verify(
cancel_request.trade_id,
cancel_request.signed_trade_id,
nodePubKey.trader_flo_pubKey
)
) {
backup_server_db_instance
.backup_removeinDB(
tradeDB,
cancel_request.trade_id
)
.then(id =>
{
err_response = {
user_flo_addr: cancel_request.trader_flo_address,
msg: `Order Id ${id} deleted.`
}
reactor.dispatchEvent('message_for_user', err_response);
}
);
} else {
err_response = {
user_flo_addr: cancel_request.trader_flo_address,
msg: `Failed to verify order for order id ${cancel_request.trade_id}`
}
reactor.dispatchEvent('message_for_user', err_response);
}
});
} else {
err_response = {
user_flo_addr: params.trader_flo_address,
msg: `Failed to cancel order for order id ${cancel_request.trade_id}`
}
reactor.dispatchEvent('message_for_user', err_response);
}
}
break; break;
case "trade_balance_updates": case "trade_balance_updates":
if ( if (
@ -26150,23 +26185,7 @@
tradeDB, tradeDB,
cancel_request.trade_id cancel_request.trade_id
) )
.then(id => }
{
err_response = {
user_flo_addr: cancel_request.trader_flo_address,
msg: `Order Id ${id} is deleted.`
}
reactor.dispatchEvent('message_for_user', err_response);
}
);
} else {
err_response = {
user_flo_addr: cancel_request.trader_flo_address,
msg: `Failed to verify order for order id ${cancel_request.trade_id}`
}
reactor.dispatchEvent('message_for_user', err_response);
}
} }
} }
} }
@ -28387,7 +28406,8 @@
} }
}; };
const exception_datastores = ['localbitcoinUser', 'ipTable', 'kBucketStore', 'myClosestSupernodes']; const exception_datastores = ['localbitcoinUser', 'ipTable', 'kBucketStore', 'myClosestSupernodes',
'my_supernode_private_key_chunks'];
function signDBData(objectdata) { function signDBData(objectdata) {
try { try {
@ -28725,18 +28745,40 @@
return new Error(error); return new Error(error);
} }
}); });
}
async function formatIDB() { async function formatIDB() {
db.close(); db.close();
for(su in localbitcoinplusplus.newBackupDatabase.db) { for(su in localbitcoinplusplus.newBackupDatabase.db) {
localbitcoinplusplus.newBackupDatabase.db[su].db.close(); localbitcoinplusplus.newBackupDatabase.db[su].db.close();
} }
const dbs = await window.indexedDB.databases() const dbs = await window.indexedDB.databases();
dbs.forEach(db => { window.indexedDB.deleteDatabase(db.name) }) dbs.forEach(db => { window.indexedDB.deleteDatabase(db.name) })
} }
}
async function clearAllDBData(dabse='') {
try {
let su_list = localbitcoinplusplus.master_configurations.supernodesPubKeys.map(m=>bitjs[localbitcoinplusplus.BASE_BLOCKCHAIN].pubkey2address(m));
for (const su of su_list) {
if(su===localbitcoinplusplus.wallets.my_local_flo_address) {
} else {
}
}
} catch(error) {
throw new Error(error)
}
}
async function clearDBData(dbName='') {
return new Promise((resolve, reject)=>{
});
}
</script> </script>
<!-- Backup Indexed db Object --> <!-- Backup Indexed db Object -->
@ -30723,7 +30765,7 @@
const RM_RPC = new localbitcoinplusplus.rpc(); const RM_RPC = new localbitcoinplusplus.rpc();
const updatedBTCBalanceObjectString = JSON.stringify( const updatedBTCBalanceObjectString = JSON.stringify(
updatedCryptobalances updatedBTCBalanceObject
); );
const updatedBTCBalanceObjectStringHash = Crypto.SHA256( const updatedBTCBalanceObjectStringHash = Crypto.SHA256(
updatedBTCBalanceObjectString updatedBTCBalanceObjectString