fixed localbitcoin object cloning error, added trade balance update function
This commit is contained in:
parent
62ddb0653f
commit
0c402ace22
@ -8338,6 +8338,7 @@
|
||||
}
|
||||
request.send();
|
||||
},
|
||||
|
||||
fetch_configs: function (callback) {
|
||||
this.floAddress = localbitcoinplusplus.RM_FLO_SENDING_ADDR;
|
||||
this.parse_flo_comments(function (floData) {
|
||||
@ -8345,14 +8346,10 @@
|
||||
|
||||
// remove this line later
|
||||
// btcTradeMargin is tolerable difference between BTC trader should deposit and BTC he actually deposited
|
||||
// RMAssets =
|
||||
// `validAssets=BTC,INR#!#supernodes=127.0.0.1,212.88.88.2#!#MASTER_NODE=023B9F60692A17FAC805D012C5C8ADA3DD19A980A3C5F0D8A5B3500CC54D6E8B75
|
||||
// #!#MASTER_RECEIVING_ADDRESS=oVRq2nka1GtALQT8pbuLHAGjqAQ7PAo6uy#!#validTradingAmount=10000,50000,100000#!#btcTradeMargin=5000
|
||||
// #!#supernodesPubKeys=038EC47A986BC5D230889E345AE922F3C36E2C15E4F25424FF647D6E3C364D869B,`;
|
||||
RMAssets =
|
||||
`validAssets=BTC,INR#!#supernodes=127.0.0.1,212.88.88.2#!#MASTER_NODE=023B9F60692A17FAC805D012C5C8ADA3DD19A980A3C5F0D8A5B3500CC54D6E8B75
|
||||
#!#MASTER_RECEIVING_ADDRESS=oVRq2nka1GtALQT8pbuLHAGjqAQ7PAo6uy#!#validTradingAmount=10000,50000,100000#!#btcTradeMargin=5000
|
||||
#!#supernodesPubKeys=0220C862663F1F4BB44497C6223DB82BB3E645A5D71EEF9A330207E16D379650A8,`;
|
||||
#!#supernodesPubKeys=02B3539473573D939CE276C6B9C2B5F513396BE42C0BDAEE2C294AEF2B39605907,`;
|
||||
let floAssetsArray = RMAssets.split('#!#');
|
||||
|
||||
if (floAssetsArray.length > 0 && typeof floAssetsArray[0] !== undefined &&
|
||||
@ -8376,6 +8373,7 @@
|
||||
enumerable: true
|
||||
});
|
||||
});
|
||||
deepFreeze(localbitcoinplusplus.master_configurations);
|
||||
return callback(localbitcoinplusplus);
|
||||
} catch (error) {
|
||||
console.error('FATAL ERROR: Failed to fetch master configuration: ', error);
|
||||
@ -8383,7 +8381,7 @@
|
||||
}
|
||||
return false;
|
||||
});
|
||||
}
|
||||
},
|
||||
}
|
||||
</script>
|
||||
|
||||
@ -8524,6 +8522,8 @@
|
||||
.call(this, "trade_buy_request_response",
|
||||
supernode_signed_res);
|
||||
doSend(buy_request_response);
|
||||
// Init trading
|
||||
localbitcoinplusplus.trade.prototype.createTradePipes();
|
||||
return true;
|
||||
}
|
||||
});
|
||||
@ -8544,6 +8544,8 @@
|
||||
.call(this, "trade_sell_request_response",
|
||||
supernode_signed_res);
|
||||
doSend(sell_request_response);
|
||||
// Init trading
|
||||
localbitcoinplusplus.trade.prototype.createTradePipes();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@ -8761,8 +8763,8 @@
|
||||
btc_balance_res.btc_balance > 0) {
|
||||
let withdrawer_btc_balance = parseFloat(btc_balance_res.btc_balance);
|
||||
let withdrawing_btc_amount = parseFloat(params.withdrawing_amount);
|
||||
let eqBTC = localbitcoinplusplus.trade.prototype.calculateBTCEquivalentOfCash(
|
||||
withdrawing_btc_amount);
|
||||
let eqBTC = localbitcoinplusplus.trade.prototype.calculateBTCEquivalentOfCash(withdrawing_btc_amount);
|
||||
eqBTC = parseFloat(eqBTC).toFixed(8);
|
||||
if (withdrawer_btc_balance > 0 && withdrawing_btc_amount > 0
|
||||
&& eqBTC > 0 && eqBTC <= withdrawer_btc_balance) {
|
||||
|
||||
@ -9058,11 +9060,10 @@
|
||||
throw new Error("Insufficient balance.");
|
||||
}
|
||||
// calculate equivalent BTC for x amount of Cash
|
||||
let eqBTC = localbitcoinplusplus.trade.prototype.calculateBTCEquivalentOfCash(
|
||||
buy_price_btc);
|
||||
|
||||
if (!isNaN(eqBTC) && typeof eqBTC == "number") {
|
||||
eqBTC = parseFloat(eqBTC);
|
||||
let eqBTC = localbitcoinplusplus.trade.prototype.calculateBTCEquivalentOfCash(buy_price_btc);
|
||||
eqBTC = parseFloat(eqBTC);
|
||||
if (typeof eqBTC == "number" && eqBTC>0) {
|
||||
|
||||
let res_btc;
|
||||
|
||||
// supernode data query
|
||||
@ -9123,9 +9124,9 @@
|
||||
let sell_price_in_inr = parseFloat(params.buy_price);
|
||||
let eqBTC = localbitcoinplusplus.trade.prototype.calculateBTCEquivalentOfCash(
|
||||
sell_price_in_inr);
|
||||
|
||||
if (!isNaN(eqBTC) && typeof eqBTC == "number") {
|
||||
eqBTC = parseFloat(eqBTC);
|
||||
eqBTC = parseFloat(eqBTC);
|
||||
if (typeof eqBTC == "number" && eqBTC>0) {
|
||||
|
||||
if (seller_btc_balance < eqBTC) {
|
||||
throw new Error("Insufficient BTC balance.");
|
||||
}
|
||||
@ -9218,7 +9219,7 @@
|
||||
if (localbitcoinplusplus.master_configurations.validTradingAmount.includes(btc_buy_price)) {
|
||||
let current_btc_price = localbitcoinplusplus.trade.prototype.get_current_btc_price_in_fiat.call();
|
||||
if (current_btc_price > 0) {
|
||||
return parseFloat(btc_buy_price / current_btc_price);
|
||||
return parseFloat(btc_buy_price / current_btc_price).toFixed(8);
|
||||
}
|
||||
}
|
||||
return null;
|
||||
@ -9320,6 +9321,7 @@
|
||||
});
|
||||
},
|
||||
|
||||
/*Finds the best buy sell id match for a trade*/
|
||||
createTradePipes() {
|
||||
try {
|
||||
readAllDB("sellOrders", function(sellOrdersList) {
|
||||
@ -9337,10 +9339,15 @@
|
||||
|
||||
if (buyPipe.value.length>0 && sellPipe.value.length>0) {
|
||||
for (let i = 0; i < n; i++) {
|
||||
localbitcoinplusplus.trade.prototype.launchTrade(buyPipe.value[i].id, sellPipe.value[i].id);
|
||||
localbitcoinplusplus.trade.prototype.launchTrade(buyPipe.value[i], sellPipe.value[i], function(supernode_res) {
|
||||
console.log(supernode_res);
|
||||
if (typeof supernode_res=="object") {
|
||||
let server_res = localbitcoinplusplus.rpc.prototype.send_rpc.call(this, "trade_balance_updates", supernode_res);
|
||||
doSend(server_res);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
});
|
||||
}
|
||||
});
|
||||
@ -9350,8 +9357,152 @@
|
||||
console.error(e);
|
||||
}
|
||||
},
|
||||
launchTrade(buyId, sellId) {
|
||||
console.log(buyId, sellId);
|
||||
launchTrade(buyPipeObj, sellPipeObj, callback) {
|
||||
if (buyPipeObj.order_type=="buy" && sellPipeObj.order_type=="sell"
|
||||
&& buyPipeObj.buy_price == sellPipeObj.buy_price
|
||||
&& buyPipeObj.buy_price == sellPipeObj.buy_price == 1
|
||||
&& buyPipeObj.buy_price == sellPipeObj.buy_price
|
||||
) {
|
||||
// Check buyer's cash balance
|
||||
readDB("cash_balances", buyPipeObj.trader_flo_address, function(buyPipeCashRes) {
|
||||
if(typeof buyPipeCashRes == "object" && typeof buyPipeCashRes.cash_balance == "number") {
|
||||
let buyer_cash_balance = parseFloat(buyPipeCashRes.cash_balance);
|
||||
let buy_price_btc = parseFloat(buyPipeObj.buy_price);
|
||||
if (buyer_cash_balance < buy_price_btc) {
|
||||
throw new Error("Insufficient cash balance of buyer.");
|
||||
}
|
||||
// calculate equivalent BTC for x amount of Cash
|
||||
let eqBTCBuyer = localbitcoinplusplus.trade.prototype.calculateBTCEquivalentOfCash(buy_price_btc);
|
||||
|
||||
if (!isNaN(eqBTCBuyer) && eqBTCBuyer != "" && eqBTCBuyer != undefined) {
|
||||
eqBTCBuyer = parseFloat(eqBTCBuyer);
|
||||
}
|
||||
|
||||
// Check seller's BTC balance
|
||||
readDB("btc_balances", sellPipeObj.trader_flo_address, function(sellPipeBTCRes) {
|
||||
if (typeof sellPipeBTCRes=="object" && typeof sellPipeBTCRes.btc_balance=="number") {
|
||||
let seller_btc_balance = parseFloat(sellPipeBTCRes.btc_balance).toFixed(8);
|
||||
let sell_price_in_inr = parseFloat(sellPipeObj.buy_price);
|
||||
let eqBTCSeller = localbitcoinplusplus.trade.prototype.calculateBTCEquivalentOfCash(sell_price_in_inr);
|
||||
if (!isNaN(eqBTCSeller) && eqBTCSeller != "" && eqBTCSeller != undefined) {
|
||||
eqBTCSeller = parseFloat(eqBTCSeller);
|
||||
if (seller_btc_balance < eqBTCSeller) {
|
||||
throw new Error("Insufficient BTC balance of seller.");
|
||||
}
|
||||
|
||||
// Increase buyer's BTC balance
|
||||
let buyerBTCResponseObject;
|
||||
readDB("btc_balances", buyPipeObj.trader_flo_address, function(buyPipeBTCRes) {
|
||||
if (typeof buyPipeBTCRes == "object" && typeof buyPipeBTCRes.btc_balance == "number") {
|
||||
buyPipeBTCRes.btc_balance = parseFloat(buyPipeBTCRes.btc_balance) + eqBTCBuyer;
|
||||
buyerBTCResponseObject = buyPipeBTCRes;
|
||||
} else {
|
||||
// The user bought BTC for first time
|
||||
buyerBTCResponseObject = {
|
||||
trader_flo_address: buyPipeObj.trader_flo_address,
|
||||
btc_balance: eqBTCBuyer
|
||||
}
|
||||
}
|
||||
|
||||
// Descrease buyer cash balance
|
||||
let buyer_new_cash_balance = buyer_cash_balance - buy_price_btc;
|
||||
|
||||
let buyerCashResponseObject = {
|
||||
trader_flo_address: buyPipeObj.trader_flo_address,
|
||||
cash_balance: buyer_new_cash_balance
|
||||
}
|
||||
|
||||
// Increase seller's Cash balance
|
||||
let sellerCashResponseObject;
|
||||
readDB("cash_balances", sellPipeObj.trader_flo_address, function (sellPipeCashRes) {
|
||||
if (typeof sellPipeCashRes == "object" && typeof sellPipeCashRes.cash_balance == "number"
|
||||
&& !isNaN(sellPipeCashRes.cash_balance)) {
|
||||
sellPipeCashRes.cash_balance = parseFloat(sellPipeCashRes.cash_balance)+sell_price_in_inr;
|
||||
sellerCashResponseObject = sellPipeCashRes;
|
||||
} else {
|
||||
// User got cash for the first time
|
||||
sellerCashResponseObject = {
|
||||
trader_flo_address: sellPipeObj.trader_flo_address,
|
||||
cash_balance: sell_price_in_inr
|
||||
}
|
||||
}
|
||||
|
||||
// Decrease seller BTC balance
|
||||
let new_seller_btc_balance = seller_btc_balance - eqBTCSeller;
|
||||
let sellerBTCResponseObject = {
|
||||
trader_flo_address: sellPipeObj.trader_flo_address,
|
||||
btc_balance: new_seller_btc_balance
|
||||
}
|
||||
|
||||
// supernode data query
|
||||
readDB('localbitcoinUser', '00-01', function (user_data) {
|
||||
if (typeof user_data == "object" && typeof user_data.myLocalFLOPrivateKey ==
|
||||
"string" && user_data.myLocalFLOPrivateKey.length > 0) {
|
||||
// Delete orders
|
||||
try {
|
||||
removeinDB("buyOrders", buyPipeObj.id);
|
||||
removeinDB("sellOrders", sellPipeObj.id);
|
||||
} catch (error) {
|
||||
callback(false);
|
||||
throw new Error(error);
|
||||
}
|
||||
|
||||
// Update balances
|
||||
try {
|
||||
updateinDB("cash_balances", buyerCashResponseObject, buyPipeObj.trader_flo_address);
|
||||
updateinDB("cash_balances", sellerCashResponseObject, sellPipeObj.trader_flo_address);
|
||||
updateinDB("btc_balances", buyerBTCResponseObject, buyPipeObj.trader_flo_address);
|
||||
updateinDB("btc_balances", sellerBTCResponseObject, sellPipeObj.trader_flo_address);
|
||||
} catch (error) {
|
||||
callback(false);
|
||||
throw new Error(error);
|
||||
}
|
||||
|
||||
// Prepare response
|
||||
let trade_infos = {
|
||||
"buy_order_id": buyPipeObj.id,
|
||||
"sell_order_id": sellPipeObj.id,
|
||||
"buyer_flo_id": buyPipeObj.trader_flo_address,
|
||||
"seller_flo_id": sellPipeObj.trader_flo_address
|
||||
}
|
||||
|
||||
let trade_infos_str = JSON.stringify(trade_infos);
|
||||
let buyerCashResponseObjectStr = JSON.stringify(buyerCashResponseObject);
|
||||
let sellerCashResponseObjectStr = JSON.stringify(sellerCashResponseObject);
|
||||
let buyerBTCResponseObjectStr = JSON.stringify(buyerBTCResponseObject);
|
||||
let sellerBTCResponseObjectStr = JSON.stringify(sellerBTCResponseObject);
|
||||
|
||||
let res_str = `${trade_infos_str}${buyerCashResponseObjectStr}${sellerCashResponseObjectStr}${buyerBTCResponseObjectStr}${sellerBTCResponseObjectStr}`;
|
||||
|
||||
let hashed_data = Crypto.SHA256(res_str);
|
||||
|
||||
// Signing of the data by Supernode
|
||||
let signed_data = localbitcoinplusplus.wallets.prototype
|
||||
.sign(hashed_data, user_data.myLocalFLOPrivateKey);
|
||||
|
||||
let response_for_client = {
|
||||
"trade_infos": trade_infos,
|
||||
"buyer_cash_data": buyerCashResponseObject,
|
||||
"seller_cash_data": sellerCashResponseObject,
|
||||
"buyer_btc_data": buyerBTCResponseObject,
|
||||
"seller_btc_data": sellerBTCResponseObject,
|
||||
"data_hash": hashed_data,
|
||||
"supernode_sign": signed_data,
|
||||
"supernodePubKey": user_data.myLocalFLOPublicKey
|
||||
}
|
||||
callback(response_for_client);
|
||||
return true;
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
callback(false);
|
||||
}
|
||||
},
|
||||
}
|
||||
</script>
|
||||
@ -9392,7 +9543,6 @@
|
||||
xhr.send(encodeURI(data));
|
||||
},
|
||||
|
||||
|
||||
}
|
||||
</script>
|
||||
|
||||
@ -9613,8 +9763,6 @@
|
||||
}
|
||||
|
||||
function onMessage(evt) {
|
||||
console.log(evt);
|
||||
|
||||
var response = evt.data;
|
||||
var res_pos = response.indexOf('{');
|
||||
if (res_pos >= 0) {
|
||||
@ -9712,6 +9860,37 @@
|
||||
}
|
||||
}
|
||||
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];
|
||||
// Verify data
|
||||
let res_str = `${trade_balance_res.buyer_cash_data}${trade_balance_res.seller_cash_data}${trade_balance_res.buyer_btc_data}${trade_balance_res.seller_btc_data}`;
|
||||
let hashed_data = Crypto.SHA256(res_str);
|
||||
if (localbitcoinplusplus.master_configurations.supernodesPubKeys.includes(trade_balance_res.supernodePubKey)) {
|
||||
if (localbitcoinplusplus.wallets.prototype.verify(hashed_data, trade_balance_res.supernode_sign, trade_balance_res.supernodePubKey)) {
|
||||
// Delete orders in clients DB
|
||||
try {
|
||||
removeinDB("buyOrders", trade_balance_res.trade_infos.buy_order_id);
|
||||
removeinDB("sellOrders", trade_balance_res.trade_infos.sell_order_id);
|
||||
} catch (error) {
|
||||
callback(false);
|
||||
throw new Error(error);
|
||||
}
|
||||
|
||||
// Update balances in clients DB
|
||||
try {
|
||||
updateinDB("cash_balances", trade_balance_res.buyer_cash_data, trade_balance_res.trade_infos.buyer_flo_id);
|
||||
updateinDB("cash_balances", trade_balance_res.seller_cash_data, trade_balance_res.trade_infos.seller_flo_id);
|
||||
updateinDB("btc_balances", trade_balance_res.buyer_btc_data, trade_balance_res.trade_infos.buyer_flo_id);
|
||||
updateinDB("btc_balances", trade_balance_res.seller_btc_data, trade_balance_res.trade_infos.seller_flo_id);
|
||||
} catch (error) {
|
||||
callback(false);
|
||||
throw new Error(error);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@ -10228,7 +10407,7 @@
|
||||
asset_box.appendChild(assetTypeInput);
|
||||
if (typeof localbitcoinplusplus.master_configurations.validAssets !== 'undefined' &&
|
||||
localbitcoinplusplus.master_configurations.validAssets.length > 0) {
|
||||
let assetTypeSelectArray = localbitcoinplusplus.master_configurations.validAssets;
|
||||
let assetTypeSelectArray = JSON.parse(JSON.stringify(localbitcoinplusplus.master_configurations.validAssets));
|
||||
assetTypeSelectArray.unshift("Select Asset Type");
|
||||
for (var i = 0; i < assetTypeSelectArray.length; i++) {
|
||||
var option = document.createElement("option");
|
||||
@ -10244,7 +10423,7 @@
|
||||
asset_box.appendChild(tradeAmountSelect);
|
||||
if (typeof localbitcoinplusplus.master_configurations.validTradingAmount !== 'undefined' &&
|
||||
localbitcoinplusplus.master_configurations.validTradingAmount.length > 0) {
|
||||
let tradeAmountSelectArray = localbitcoinplusplus.master_configurations.validTradingAmount;
|
||||
let tradeAmountSelectArray = JSON.parse(JSON.stringify(localbitcoinplusplus.master_configurations.validTradingAmount));
|
||||
tradeAmountSelectArray.unshift("Select Asset Amount");
|
||||
for (var i = 0; i < tradeAmountSelectArray.length; i++) {
|
||||
var option = document.createElement("option");
|
||||
@ -10337,6 +10516,21 @@
|
||||
});
|
||||
}
|
||||
|
||||
/*https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze*/
|
||||
function deepFreeze(object) {
|
||||
// Retrieve the property names defined on object
|
||||
var propNames = Object.getOwnPropertyNames(object);
|
||||
|
||||
// Freeze properties before freezing self
|
||||
for (let name of propNames) {
|
||||
let value = object[name];
|
||||
|
||||
object[name] = value && typeof value === "object" ?
|
||||
deepFreeze(value) : value;
|
||||
}
|
||||
return Object.freeze(object);
|
||||
}
|
||||
|
||||
//Function to check current balance of a BTC address
|
||||
//trader_flo_address, BTCAddress, bitcoinToBePaid
|
||||
function validateDepositedBTCBalance(trader_deposits) {
|
||||
|
||||
Loading…
Reference in New Issue
Block a user