modified code in buy, sell and launchTrade due to dbHash logic
This commit is contained in:
parent
78321e0079
commit
7a9204d308
638
index.html
638
index.html
@ -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
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user