improved launchTrade function
This commit is contained in:
parent
7a9204d308
commit
8c7fa7a25d
424
index.html
424
index.html
@ -11627,7 +11627,7 @@
|
||||
|
||||
const ENVR = 'TEST'; // LIVE, TEST
|
||||
const WS = 'ws';
|
||||
const DBName = "localbitcoinDB";
|
||||
const DBName = "localbitcoinDBRemote";
|
||||
|
||||
if(ENVR === 'LIVE') {
|
||||
|
||||
@ -20331,19 +20331,19 @@
|
||||
RM_TRADE.launchTrade(
|
||||
buyPipe.value[i],
|
||||
sellPipe.value[i],
|
||||
function(supernode_res) {
|
||||
if (typeof supernode_res == "object") {
|
||||
RM_RPC.send_rpc
|
||||
backup_db
|
||||
).then(supernode_res=>{
|
||||
if (supernode_res!==false
|
||||
&& typeof supernode_res == "object") {
|
||||
RM_RPC.send_rpc
|
||||
.call(
|
||||
this,
|
||||
"trade_balance_updates",
|
||||
supernode_res
|
||||
this,
|
||||
"trade_balance_updates",
|
||||
supernode_res
|
||||
)
|
||||
.then(server_res => doSend(server_res));
|
||||
}
|
||||
},
|
||||
backup_db
|
||||
);
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -20356,7 +20356,7 @@
|
||||
console.error(e);
|
||||
}
|
||||
},
|
||||
launchTrade(buyPipeObj, sellPipeObj, callback, backup_db = "") {
|
||||
async launchTrade(buyPipeObj, sellPipeObj, backup_db = "") {
|
||||
let _addDB = addDB;
|
||||
let _readDB = readDB;
|
||||
let _readDBbyIndex = readDBbyIndex;
|
||||
@ -20366,203 +20366,172 @@
|
||||
let _removeByIndex = removeByIndex;
|
||||
let _removeAllinDB = removeAllinDB;
|
||||
if (typeof backup_db == "string" && backup_db.length > 0) {
|
||||
if (
|
||||
typeof localbitcoinplusplus.newBackupDatabase.db[backup_db] ==
|
||||
"object"
|
||||
) {
|
||||
const foreign_db =
|
||||
localbitcoinplusplus.newBackupDatabase.db[backup_db];
|
||||
_addDB = foreign_db.backup_addDB.bind(foreign_db);
|
||||
_readDB = foreign_db.backup_readDB.bind(foreign_db);
|
||||
_readDBbyIndex = foreign_db.backup_readDBbyIndex.bind(foreign_db);
|
||||
_readAllDB = foreign_db.backup_readAllDB.bind(foreign_db);
|
||||
_updateinDB = foreign_db.backup_updateinDB.bind(foreign_db);
|
||||
_removeinDB = foreign_db.backup_removeinDB.bind(foreign_db);
|
||||
_removeByIndex = foreign_db.backup_removeByIndex.bind(foreign_db);
|
||||
} else {
|
||||
err_msg = `WARNING: Invalid Backup DB Instance Id: ${backup_db}.`;
|
||||
showMessage(err_msg);
|
||||
throw new Error(err_msg);
|
||||
}
|
||||
}
|
||||
if (
|
||||
buyPipeObj.order_type == "buy" &&
|
||||
sellPipeObj.order_type == "sell" &&
|
||||
buyPipeObj.buy_price == sellPipeObj.buy_price &&
|
||||
buyPipeObj.currency == sellPipeObj.currency &&
|
||||
buyPipeObj.product == sellPipeObj.product
|
||||
) {
|
||||
const RM_TRADE = new localbitcoinplusplus.trade();
|
||||
const RM_WALLET = new localbitcoinplusplus.wallets();
|
||||
let err_msg;
|
||||
// Check buyer's cash balance
|
||||
const buyer_cash_id = `${buyPipeObj.trader_flo_address}_${buyPipeObj.currency}`;
|
||||
_readDB("cash_balances", buyer_cash_id).then(function(
|
||||
buyPipeCashRes
|
||||
) {
|
||||
if (
|
||||
typeof buyPipeCashRes == "object" &&
|
||||
typeof buyPipeCashRes.cash_balance == "number"
|
||||
typeof localbitcoinplusplus.newBackupDatabase.db[backup_db] ==
|
||||
"object"
|
||||
) {
|
||||
let buyer_cash_balance = parseFloat(
|
||||
buyPipeCashRes.cash_balance
|
||||
);
|
||||
let buy_price_btc = parseFloat(buyPipeObj.buy_price);
|
||||
if (buyer_cash_balance < buy_price_btc) {
|
||||
err_msg = "Insufficient cash balance of buyer.";
|
||||
const foreign_db =
|
||||
localbitcoinplusplus.newBackupDatabase.db[backup_db];
|
||||
_addDB = foreign_db.backup_addDB.bind(foreign_db);
|
||||
_readDB = foreign_db.backup_readDB.bind(foreign_db);
|
||||
_readDBbyIndex = foreign_db.backup_readDBbyIndex.bind(foreign_db);
|
||||
_readAllDB = foreign_db.backup_readAllDB.bind(foreign_db);
|
||||
_updateinDB = foreign_db.backup_updateinDB.bind(foreign_db);
|
||||
_removeinDB = foreign_db.backup_removeinDB.bind(foreign_db);
|
||||
_removeByIndex = foreign_db.backup_removeByIndex.bind(foreign_db);
|
||||
} else {
|
||||
err_msg = `WARNING: Invalid Backup DB Instance Id: ${backup_db}.`;
|
||||
showMessage(err_msg);
|
||||
throw new Error(err_msg);
|
||||
}
|
||||
// calculate equivalent BTC for x amount of Cash
|
||||
let eqBTCBuyer = RM_TRADE.calculateCryptoEquivalentOfCash(
|
||||
buy_price_btc,
|
||||
buyPipeObj.currency,
|
||||
buyPipeObj.product
|
||||
);
|
||||
|
||||
}
|
||||
if (
|
||||
buyPipeObj.order_type == "buy" &&
|
||||
sellPipeObj.order_type == "sell" &&
|
||||
buyPipeObj.buy_price == sellPipeObj.buy_price &&
|
||||
buyPipeObj.currency == sellPipeObj.currency &&
|
||||
buyPipeObj.product == sellPipeObj.product
|
||||
) {
|
||||
const RM_TRADE = new localbitcoinplusplus.trade();
|
||||
const RM_WALLET = new localbitcoinplusplus.wallets();
|
||||
let err_msg;
|
||||
// Check buyer's cash balance
|
||||
const buyer_cash_id = `${buyPipeObj.trader_flo_address}_${buyPipeObj.currency}`;
|
||||
const buyPipeCashRes = await _readDB("cash_balances", buyer_cash_id);
|
||||
if (
|
||||
!isNaN(eqBTCBuyer) &&
|
||||
eqBTCBuyer != "" &&
|
||||
eqBTCBuyer != undefined
|
||||
typeof buyPipeCashRes == "object" &&
|
||||
typeof buyPipeCashRes.cash_balance == "number"
|
||||
) {
|
||||
eqBTCBuyer = helper_functions.truncateDecimals(eqBTCBuyer);
|
||||
}
|
||||
let buyer_cash_balance = parseFloat(buyPipeCashRes.cash_balance);
|
||||
|
||||
// Check seller's crypto balance
|
||||
let seller_btc_id = `${sellPipeObj.trader_flo_address}_${sellPipeObj.product}`;
|
||||
_readDB("crypto_balances", seller_btc_id).then(function(
|
||||
sellPipeBTCRes
|
||||
) {
|
||||
if (
|
||||
typeof sellPipeBTCRes == "object" &&
|
||||
typeof sellPipeBTCRes.crypto_balance == "number"
|
||||
) {
|
||||
let seller_btc_balance = helper_functions.truncateDecimals(sellPipeBTCRes.crypto_balance);
|
||||
let sell_price_in_inr = parseFloat(sellPipeObj.buy_price);
|
||||
let eqBTCSeller = RM_TRADE.calculateCryptoEquivalentOfCash(
|
||||
sell_price_in_inr,
|
||||
let buy_price_btc = parseFloat(buyPipeObj.buy_price);
|
||||
if (buyer_cash_balance < buy_price_btc) {
|
||||
err_msg = "Insufficient cash balance of buyer.";
|
||||
console.warn(err_msg);
|
||||
return false;
|
||||
}
|
||||
// calculate equivalent BTC for x amount of Cash
|
||||
let eqBTCBuyer = RM_TRADE.calculateCryptoEquivalentOfCash(
|
||||
buy_price_btc,
|
||||
buyPipeObj.currency,
|
||||
buyPipeObj.product
|
||||
);
|
||||
|
||||
if (
|
||||
!isNaN(eqBTCSeller) &&
|
||||
eqBTCSeller != "" &&
|
||||
eqBTCSeller != undefined
|
||||
!isNaN(eqBTCBuyer) &&
|
||||
eqBTCBuyer != "" &&
|
||||
eqBTCBuyer != undefined
|
||||
) {
|
||||
eqBTCSeller = helper_functions.truncateDecimals(eqBTCSeller);
|
||||
if (seller_btc_balance < eqBTCSeller) {
|
||||
err_msg = "Insufficient BTC balance of seller.";
|
||||
showMessage(err_msg);
|
||||
throw new Error(err_msg);
|
||||
}
|
||||
eqBTCBuyer = helper_functions.truncateDecimals(eqBTCBuyer);
|
||||
}
|
||||
|
||||
// Increase buyer's crypto balance
|
||||
let buyerBTCResponseObject;
|
||||
let buyer_btc_id = `${buyPipeObj.trader_flo_address}_${buyPipeObj.product}`;
|
||||
_readDB("crypto_balances", buyer_btc_id).then(function(
|
||||
buyPipeBTCRes
|
||||
) {
|
||||
// Check seller's crypto balance
|
||||
let seller_btc_id = `${sellPipeObj.trader_flo_address}_${sellPipeObj.product}`;
|
||||
const sellPipeBTCRes = await _readDB("crypto_balances", seller_btc_id);
|
||||
if (
|
||||
typeof sellPipeBTCRes == "object" &&
|
||||
typeof sellPipeBTCRes.crypto_balance == "number"
|
||||
) {
|
||||
let seller_btc_balance = helper_functions.truncateDecimals(sellPipeBTCRes.crypto_balance);
|
||||
let sell_price_in_inr = parseFloat(sellPipeObj.buy_price);
|
||||
let eqBTCSeller = RM_TRADE.calculateCryptoEquivalentOfCash(
|
||||
sell_price_in_inr,
|
||||
buyPipeObj.currency,
|
||||
buyPipeObj.product
|
||||
);
|
||||
if (
|
||||
typeof buyPipeBTCRes == "object" &&
|
||||
typeof buyPipeBTCRes.crypto_balance == "number"
|
||||
!isNaN(eqBTCSeller) &&
|
||||
eqBTCSeller != "" &&
|
||||
eqBTCSeller != undefined
|
||||
) {
|
||||
buyPipeBTCRes.crypto_balance =
|
||||
helper_functions.truncateDecimals(buyPipeBTCRes.crypto_balance) +
|
||||
eqBTCBuyer;
|
||||
buyerBTCResponseObject = buyPipeBTCRes;
|
||||
} else {
|
||||
// The user bought BTC for first time
|
||||
buyerBTCResponseObject = {
|
||||
id: buyer_btc_id,
|
||||
trader_flo_address: buyPipeObj.trader_flo_address,
|
||||
crypto_balance: eqBTCBuyer,
|
||||
crypto_currency: buyPipeObj.product
|
||||
};
|
||||
}
|
||||
|
||||
// Decrease buyer cash balance
|
||||
let buyer_new_cash_balance =
|
||||
buyer_cash_balance - buy_price_btc;
|
||||
|
||||
let buyerCashResponseObject = {
|
||||
id: buyer_cash_id,
|
||||
currency: buyPipeObj.currency,
|
||||
trader_flo_address: buyPipeObj.trader_flo_address,
|
||||
cash_balance: buyer_new_cash_balance
|
||||
};
|
||||
|
||||
// Increase seller's Cash balance
|
||||
let sellerCashResponseObject;
|
||||
const seller_cash_id = `${sellPipeObj.trader_flo_address}_${buyPipeObj.currency}`;
|
||||
_readDB("cash_balances", seller_cash_id).then(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
|
||||
let seller_cash_id = `${sellPipeObj.trader_flo_address}_${buyPipeObj.currency}`;
|
||||
sellerCashResponseObject = {
|
||||
id: seller_cash_id,
|
||||
trader_flo_address:
|
||||
sellPipeObj.trader_flo_address,
|
||||
currency: buyPipeObj.currency,
|
||||
cash_balance: sell_price_in_inr
|
||||
};
|
||||
eqBTCSeller = helper_functions.truncateDecimals(eqBTCSeller);
|
||||
if (seller_btc_balance < eqBTCSeller) {
|
||||
err_msg = "Insufficient BTC balance of seller.";
|
||||
console.warn(err_msg);
|
||||
return false;
|
||||
}
|
||||
|
||||
// Decrease seller BTC balance
|
||||
let new_seller_btc_balance =
|
||||
seller_btc_balance - eqBTCSeller;
|
||||
new_seller_btc_balance = helper_functions.truncateDecimals(new_seller_btc_balance);
|
||||
// Get Buyer's crypto balance
|
||||
let buyerBTCResponseObject;
|
||||
let buyer_btc_id = `${buyPipeObj.trader_flo_address}_${buyPipeObj.product}`;
|
||||
const buyPipeBTCRes = await _readDB("crypto_balances", buyer_btc_id);
|
||||
|
||||
// Increase buyer's crypto balance
|
||||
if (
|
||||
typeof buyPipeBTCRes == "object" &&
|
||||
typeof buyPipeBTCRes.crypto_balance == "number"
|
||||
) {
|
||||
buyPipeBTCRes.crypto_balance =
|
||||
helper_functions.truncateDecimals(buyPipeBTCRes.crypto_balance) +
|
||||
eqBTCBuyer;
|
||||
buyerBTCResponseObject = buyPipeBTCRes;
|
||||
} else {
|
||||
// The user bought BTC for first time
|
||||
buyerBTCResponseObject = {
|
||||
id: buyer_btc_id,
|
||||
trader_flo_address: buyPipeObj.trader_flo_address,
|
||||
crypto_balance: eqBTCBuyer,
|
||||
crypto_currency: buyPipeObj.product
|
||||
};
|
||||
}
|
||||
|
||||
let sellerBTCResponseObject = {
|
||||
id: `${sellPipeObj.trader_flo_address}_${sellPipeObj.product}`,
|
||||
trader_flo_address: sellPipeObj.trader_flo_address,
|
||||
crypto_balance: new_seller_btc_balance,
|
||||
crypto_currency: sellPipeObj.product
|
||||
};
|
||||
// Get Seller's cash balance
|
||||
let sellerCashResponseObject;
|
||||
const seller_cash_id = `${sellPipeObj.trader_flo_address}_${buyPipeObj.currency}`;
|
||||
const sellPipeCashRes = await _readDB("cash_balances", seller_cash_id);
|
||||
|
||||
// Increase seller's Cash balance
|
||||
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
|
||||
let seller_cash_id = `${sellPipeObj.trader_flo_address}_${buyPipeObj.currency}`;
|
||||
sellerCashResponseObject = {
|
||||
id: seller_cash_id,
|
||||
trader_flo_address:
|
||||
sellPipeObj.trader_flo_address,
|
||||
currency: buyPipeObj.currency,
|
||||
cash_balance: sell_price_in_inr
|
||||
};
|
||||
}
|
||||
|
||||
// Decrease buyer cash balance
|
||||
buyPipeCashRes.cash_balance = buyer_cash_balance - buy_price_btc;
|
||||
let buyerCashResponseObject = buyPipeCashRes;
|
||||
|
||||
// Decrease seller BTC balance
|
||||
sellPipeBTCRes.crypto_balance = helper_functions.truncateDecimals(seller_btc_balance - eqBTCSeller);
|
||||
|
||||
let sellerBTCResponseObject = sellPipeBTCRes;
|
||||
|
||||
// supernode data query
|
||||
readDB("localbitcoinUser", "00-01").then(async function(
|
||||
user_data
|
||||
) {
|
||||
const user_data = await readDB("localbitcoinUser", "00-01");
|
||||
if (
|
||||
typeof user_data == "object" &&
|
||||
typeof localbitcoinplusplus.wallets
|
||||
.MY_SUPERNODE_PRIVATE_KEY == "string" &&
|
||||
.MY_SUPERNODE_PRIVATE_KEY == "string" &&
|
||||
localbitcoinplusplus.wallets
|
||||
.MY_SUPERNODE_PRIVATE_KEY.length > 0
|
||||
.MY_SUPERNODE_PRIVATE_KEY.length > 0
|
||||
) {
|
||||
// Delete orders
|
||||
try {
|
||||
_removeinDB("buyOrders", buyPipeObj.id);
|
||||
_removeinDB("sellOrders", sellPipeObj.id);
|
||||
await _removeinDB("buyOrders", buyPipeObj.id);
|
||||
await _removeinDB("sellOrders", sellPipeObj.id);
|
||||
} catch (error) {
|
||||
callback(false);
|
||||
showMessage(
|
||||
`WARNING: Failed to delete respective buy and sell orders in an operation.`
|
||||
);
|
||||
throw new Error(error);
|
||||
console.error(`WARNING: Failed to delete respective buy
|
||||
and sell orders in an operation:
|
||||
${error} `);
|
||||
return false;
|
||||
}
|
||||
|
||||
// Update balances
|
||||
try {
|
||||
|
||||
} catch (error) {
|
||||
showMessage(
|
||||
`WARNING: Failed to update cash and crypto balances during launch trade operation.`
|
||||
);
|
||||
callback(false);
|
||||
throw new Error(error);
|
||||
}
|
||||
|
||||
let buyerCashResponseObjectPromise = _updateinDB(
|
||||
"cash_balances",
|
||||
@ -20570,34 +20539,37 @@
|
||||
buyPipeObj.trader_flo_address
|
||||
);
|
||||
let sellerCashResponseObjectPromise = _updateinDB(
|
||||
"cash_balances",
|
||||
sellerCashResponseObject,
|
||||
sellPipeObj.trader_flo_address
|
||||
"cash_balances",
|
||||
sellerCashResponseObject,
|
||||
sellPipeObj.trader_flo_address
|
||||
);
|
||||
let buyerBTCResponseObjectPromise = _updateinDB(
|
||||
"crypto_balances",
|
||||
buyerBTCResponseObject,
|
||||
buyPipeObj.trader_flo_address
|
||||
"crypto_balances",
|
||||
buyerBTCResponseObject,
|
||||
buyPipeObj.trader_flo_address
|
||||
);
|
||||
let sellerBTCResponseObjectPromise = _updateinDB(
|
||||
"crypto_balances",
|
||||
sellerBTCResponseObject,
|
||||
sellPipeObj.trader_flo_address
|
||||
"crypto_balances",
|
||||
sellerBTCResponseObject,
|
||||
sellPipeObj.trader_flo_address
|
||||
);
|
||||
|
||||
const balanceUpdatePromises = await Promise.all([
|
||||
buyerCashResponseObjectPromise,
|
||||
sellerCashResponseObjectPromise,
|
||||
buyerBTCResponseObjectPromise,
|
||||
buyerCashResponseObjectPromise,
|
||||
sellerCashResponseObjectPromise,
|
||||
buyerBTCResponseObjectPromise,
|
||||
sellerBTCResponseObjectPromise
|
||||
]);
|
||||
]).catch(error=>{
|
||||
console.error(error);
|
||||
return false;
|
||||
});
|
||||
|
||||
// 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
|
||||
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);
|
||||
@ -20620,42 +20592,36 @@
|
||||
|
||||
// Signing of the data by Supernode
|
||||
let signed_data = RM_WALLET.sign(
|
||||
hashed_data,
|
||||
localbitcoinplusplus.wallets
|
||||
.MY_SUPERNODE_PRIVATE_KEY
|
||||
hashed_data,
|
||||
localbitcoinplusplus.wallets
|
||||
.MY_SUPERNODE_PRIVATE_KEY
|
||||
);
|
||||
|
||||
localbitcoinplusplus.kademlia
|
||||
.determineClosestSupernode(
|
||||
buyPipeObj.trader_flo_address
|
||||
)
|
||||
.then(getPrimarySuObj => {
|
||||
let response_for_client = {
|
||||
trade_infos: trade_infos,
|
||||
buyer_cash_data: balanceUpdatePromises[0],
|
||||
seller_cash_data: balanceUpdatePromises[1],
|
||||
buyer_btc_data: balanceUpdatePromises[2],
|
||||
seller_btc_data: balanceUpdatePromises[3],
|
||||
data_hash: hashed_data,
|
||||
supernode_sign: signed_data,
|
||||
supernodePubKey:
|
||||
user_data.myLocalFLOPublicKey,
|
||||
trader_flo_address:
|
||||
getPrimarySuObj[0].data.id
|
||||
};
|
||||
callback(response_for_client);
|
||||
return true;
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
callback(false);
|
||||
.determineClosestSupernode(
|
||||
buyPipeObj.trader_flo_address
|
||||
)
|
||||
.then(getPrimarySuObj => {
|
||||
let response_for_client = {
|
||||
trade_infos: trade_infos,
|
||||
buyer_cash_data: balanceUpdatePromises[0],
|
||||
seller_cash_data: balanceUpdatePromises[1],
|
||||
buyer_btc_data: balanceUpdatePromises[2],
|
||||
seller_btc_data: balanceUpdatePromises[3],
|
||||
data_hash: hashed_data,
|
||||
supernode_sign: signed_data,
|
||||
supernodePubKey:
|
||||
user_data.myLocalFLOPublicKey,
|
||||
trader_flo_address:
|
||||
getPrimarySuObj[0].data.id
|
||||
};
|
||||
return response_for_client;
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
} else return false;
|
||||
} else return false;
|
||||
}
|
||||
},
|
||||
cancelTrade(trade_id, trader_flo_address, trade_type) {
|
||||
@ -29130,10 +29096,10 @@
|
||||
};
|
||||
|
||||
this.request.onsuccess = function(event) {
|
||||
if(!exception_datastores.includes(tablename)) {
|
||||
if(!verifyDBData(parent_request.result)) return resolve();
|
||||
}
|
||||
if (parent_request.result) {
|
||||
if(!exception_datastores.includes(tablename)) {
|
||||
if(!verifyDBData(parent_request.result)) return resolve();
|
||||
}
|
||||
if (filter_deletables == true) {
|
||||
if (
|
||||
typeof parent_request.result.is_deletable == "undefined"
|
||||
|
||||
Loading…
Reference in New Issue
Block a user