modified withdraw cash to update cash balance before tx

This commit is contained in:
Abhishek Sinha 2020-05-24 21:37:45 +05:30
parent 3a684568d8
commit b58b7b37f5
2 changed files with 495 additions and 443 deletions

View File

@ -12027,18 +12027,24 @@
text = `masterFLOPubKey=03EA5E2CAB18DA585400D6EC569438D415FAF200528E05D0E2B9BEAA2B5C3DCA90
#!#tradableAsset1=BTC,FLO,BTC_TEST,FLO_TEST#!#tradableAsset2=INR,USD,
#!#validTradingAmount=10,50,100,#!#btcTradeMargin=5000
#!#MaxBackups=1
#!#ordersLife={"trade":300000, "cryptoDeposit":900000, "cryptoWithdraw":300000, "cashDeposit":900000, "cashWithdraw":900000}
#!#miners_fee={"btc":0.0005, "flo":0.001}
#!#supernodesPubKeys=0315C3A20FE7096CC2E0F81A80D5F1A687B8F9EFA65242A0B0881E1BA3EE7D7D53,
026FCC6CFF6EB3A39E54BEB6E13FC2F02C3A93F4767AA80E49E7E876443F95AE5F,
#!#cashiers={"032871A74D2DDA9D0DE7135F58B5BD2D7F679D2CCA20EA7909466D1A6912DF4022":{"upi":"johnDoe@upi", "currencies":["INR"], "is_live":false},
"03DB4A12EB543B293DDBB0CE314C46C36D6761294AFBB7264A6D78F710FFD97CF0":{"upi":"janeDoe@upi", "currencies":["INR", "USD"], "is_live":false}}
#!#ShamirsMaxShares=8#!#supernodeSeeds={"ranchimall1":{"ip":"127.0.0.1:9111","kbucketId":"oZxHcbSf1JC8t5GjutopWYXs7C6Fe9p7ps"},
"ranchimall6":{"ip":"127.0.0.1:9116","kbucketId":"oV1wCeWca3VawbBTfUGKA7Vd368PATnKAx"}}`;
return callback(text);
#!#tradableAsset1=BTC,FLO,BTC_TEST,FLO_TEST#!#tradableAsset2=INR,USD,
#!#validTradingAmount=10,50,100,#!#btcTradeMargin=5000
#!#MaxBackups=1
#!#waitTime={"normaldelay":180000, "exportdelay":300000, "syncdelay":600000, "hugedelay":1200000}
#!#ordersLife={"trade":300000, "cryptoDeposit":900000, "cryptoWithdraw":300000, "cashDeposit":900000, "cashWithdraw":900000}
#!#miners_fee={"btc":0.0005, "flo":0.001}
#!#supernodesPubKeys=026FCC6CFF6EB3A39E54BEB6E13FC2F02C3A93F4767AA80E49E7E876443F95AE5F,0349B08AA1ABDCFFB6D78CD7C949665AD2FF065EA02B3C6C47A5E9592C9A1C6BCB,
039B4AA00DBFC0A6631DE6DA83526611A0E6B857D3579DF840BBDEAE8B6898E3B6,0315C3A20FE7096CC2E0F81A80D5F1A687B8F9EFA65242A0B0881E1BA3EE7D7D53
#!#specialNodes=02348523EB008BD37BF297AA360757062CB9D153C371EE727349A02F0B67910613,03C38E6523D6A2C45E00E60DC072E4D4340007F8A0026F134DCBBC670E4C44D31C
#!#cashiers={"032871A74D2DDA9D0DE7135F58B5BD2D7F679D2CCA20EA7909466D1A6912DF4022":{"upi":"johnDoe@upi", "currencies":["INR"], "is_live":false},
"03DB4A12EB543B293DDBB0CE314C46C36D6761294AFBB7264A6D78F710FFD97CF0":{"upi":"janeDoe@upi", "currencies":["INR", "USD"], "is_live":false}}
#!#ShamirsMaxShares=8#!#supernodeSeeds={
"ranchimall1":{"ip":"127.0.0.1:9111","kbucketId":"oZxHcbSf1JC8t5GjutopWYXs7C6Fe9p7ps"},
"ranchimall3":{"ip":"127.0.0.1:9113","kbucketId":"odYA6KagmbokSh9GY7yAfeTUZRtZLwecY1"},
"ranchimall5":{"ip":"127.0.0.1:9115","kbucketId":"oMhv5sAzqg77sYHxmUGZWKRrVo4P4JQduS"},
"ranchimall6":{"ip":"127.0.0.1:9116","kbucketId":"oV1wCeWca3VawbBTfUGKA7Vd368PATnKAx"}}`;
///return callback(localStorage.lppconf);
return callback(text);
if(ENVR==='LIVE') {
master_data = await helper_functions

View File

@ -16849,43 +16849,243 @@
readDB("cash_balances", trader_cash_id).then(function (
cash_balances_res
) {
if (
typeof cash_balances_res == "object" &&
typeof cash_balances_res.trader_flo_address ==
"string" &&
typeof cash_balances_res.cash_balance == "number" &&
cash_balances_res.cash_balance > 0
) {
let withdrawer_cash_balance = helper_functions.truncateDecimals(
cash_balances_res.cash_balance, 2
);
let withdrawing_cash_amount = helper_functions.truncateDecimals(
params.withdrawing_amount, 2
);
let bank_details = params.receivinAddress.trim(); // user UPI
try {
if (
withdrawer_cash_balance > 0 &&
withdrawing_cash_amount > 0 &&
withdrawer_cash_balance >= withdrawing_cash_amount
typeof cash_balances_res == "object" &&
typeof cash_balances_res.trader_flo_address ==
"string" &&
typeof cash_balances_res.cash_balance == "number" &&
cash_balances_res.cash_balance > 0
) {
// Get a cashier
const cashiersList = JSON.parse(
localbitcoinplusplus.master_configurations
.cashiers
let old_cash_balances_res = JSON.parse(JSON.stringify(cash_balances_res));
let withdrawer_cash_balance = helper_functions.truncateDecimals(
cash_balances_res.cash_balance, 2
);
const cashiersPubKeysArray = Object.keys(cashiersList);
const getAPaymentHandler = randomNoRepeats(cashiersPubKeysArray)();
const cashierFloAddr = bitjs[localbitcoinplusplus.BASE_BLOCKCHAIN].pubkey2address(
getAPaymentHandler
let withdrawing_cash_amount = helper_functions.truncateDecimals(
params.withdrawing_amount, 2
);
let bank_details = params.receivinAddress.trim(); // user UPI
if (!cashiersPubKeysArray.includes(
getAPaymentHandler
)
if (
withdrawer_cash_balance > 0 &&
withdrawing_cash_amount > 0 &&
withdrawer_cash_balance >= withdrawing_cash_amount
) {
err_msg = `ERROR: ${getAPaymentHandler} is not recognized as any Cashier's Public Key.`;
// Deduct balance of withdrawer
cash_balances_res.cash_balance -= helper_functions.truncateDecimals(
withdrawing_cash_amount, 2
);
const withdrawer_cash_data = await updateinDB(
"cash_balances",
cash_balances_res
);
// Get a cashier
const cashiersList = JSON.parse(
localbitcoinplusplus.master_configurations
.cashiers
);
const cashiersPubKeysArray = Object.keys(cashiersList);
const getAPaymentHandler = randomNoRepeats(cashiersPubKeysArray)();
const cashierFloAddr = bitjs[localbitcoinplusplus.BASE_BLOCKCHAIN].pubkey2address(
getAPaymentHandler
);
if (!cashiersPubKeysArray.includes(
getAPaymentHandler
)
) {
err_msg = `ERROR: ${getAPaymentHandler} is not recognized as any Cashier's Public Key.`;
err_response = {
user_flo_addr: params.trader_flo_address,
msg: err_msg
}
reactor.dispatchEvent('message_for_user', err_response);
throw new Error(err_msg);
}
const encoded_bank_details = localbitcoinplusplus.encrypt.encryptMessage(
bank_details,
getAPaymentHandler
);
let token_transfer_currency = "";
if (params.currency == "INR") {
token_transfer_currency = "rupee";
}
//const flo_withdraw_comment = `transfer ${withdrawing_cash_amount} ${token_transfer_currency}# to ${params.trader_flo_address}.`;
const flo_withdraw_comment = `transfer ${withdrawing_cash_amount} ${token_transfer_currency}# to ${cashierFloAddr} for ${params.trader_flo_address}.`;
// Add it to cash withdrawal table
let withdraw_request_db_object = {
id: helper_functions.unique_id(),
trader_flo_address: params.trader_flo_address,
withdraw_amount: withdrawing_cash_amount,
currency: params.currency,
receivinAddress: encoded_bank_details,
cashier_pubKey: getAPaymentHandler,
status: 1 // withdraw request called
};
readDB("localbitcoinUser", "00-01").then(function (
su_data
) {
if (
typeof su_data == "object" &&
typeof su_data.myLocalFLOPublicKey ==
"string" &&
su_data.myLocalFLOPublicKey.length > 0 &&
localbitcoinplusplus.master_configurations.supernodesPubKeys.includes(
su_data.myLocalFLOPublicKey
)
) {
let withdraw_request_db_object_hash = Crypto.SHA256(
JSON.stringify(withdraw_request_db_object)
);
withdraw_request_db_object[
"withdrawDataHash"
] = withdraw_request_db_object_hash;
withdraw_request_db_object[
"order_validator_sign"
] = RM_WALLET.sign(
withdraw_request_db_object_hash,
localbitcoinplusplus.wallets
.MY_SUPERNODE_PRIVATE_KEY
);
withdraw_request_db_object[
"order_validator_public_key"
] = su_data.myLocalFLOPublicKey;
try {
// Transfer Token
RM_TRADE.sendMultipleInputsTransaction(
localbitcoinplusplus.BASE_BLOCKCHAIN,
[localbitcoinplusplus.wallets
.MY_SUPERNODE_PRIVATE_KEY],
cashierFloAddr,
0.01,
localbitcoinplusplus.wallets
.my_local_flo_address,
async function (res) {
console.log(res);
if (typeof res == "object") {
try {
let msg = "";
let resp_txid = "";
if (
typeof res.txid == "string" &&
res.txid.length > 0
) {
resp_obj = JSON.parse(res.txid);
resp_txid = resp_obj.txid.result || resp_obj.txid;
msg = `Transaction Id for token transfer to ${params.trader_flo_address}: ${resp_txid}.`;
} else {
console.log(res);
err_response = {
user_flo_addr: cashierFloAddr,
msg: `Failed to transfer token for withdraw order ${withdraw_request_db_object.id}`
}
reactor.dispatchEvent('message_for_user', err_response);
throw new Errror(`ERROR: Failed to transfer token for withdraw order ${withdraw_request_db_object.id}.`);
return false;
}
if (msg.length > 0) {
const update_cash_balance_obj = {
withdrawer_cash_data: withdrawer_cash_data
};
const update_cash_balance_str = JSON.stringify(
update_cash_balance_obj
);
const update_cash_balance_hash = Crypto.SHA256(
update_cash_balance_str
);
const update_cash_balance_sign = RM_WALLET.sign(
update_cash_balance_hash,
localbitcoinplusplus.wallets.MY_SUPERNODE_PRIVATE_KEY
);
update_cash_balance_obj.publicKey =
localbitcoinplusplus.wallets.my_local_flo_public_key;
update_cash_balance_obj.sign = update_cash_balance_sign;
update_cash_balance_obj.hash = update_cash_balance_hash;
update_cash_balance_obj.trader_flo_address = cash_balances_res.trader_flo_address;
RM_RPC.send_rpc
.call(
this,
"update_all_new_cash_withdraw_recorded_in_db",
update_cash_balance_obj
)
.then(update_cash_balance_req =>
doSend(
update_cash_balance_req
)
);
//add the request to supernode db
withdraw_request_db_object.token_transfer_txid = resp_txid;
// Add record in Db
const withdraw_request_db_object_res = await addDB(
"withdraw_cash",
withdraw_request_db_object
);
// return back the response to client
withdraw_request_db_object_res.receiver_flo_address =
params.trader_flo_address;
withdraw_request_db_object_res.trader_flo_address =
params.trader_flo_address;
RM_RPC.send_rpc
.call(
this,
"withdrawal_request_response",
withdraw_request_db_object_res
)
.then(
withdrawal_request_response =>
doSend(
withdrawal_request_response
)
);
} else {
throw new Errror(
`ERROR: Failed to make transaction. Message length is 0: ${msg}`
);
return false;
}
} catch (e) {
updateinDB("cash_balances",
old_cash_balances_res,
old_cash_balances_res.id,
false, false
);
throw new Error(e);
}
}
},
flo_withdraw_comment
);
} catch (error) {
updateinDB("cash_balances",
old_cash_balances_res,
old_cash_balances_res.id,
false, false
);
throw new Error(error);
}
}
});
} else {
// Return error to the requester
err_msg =
"Withdrawal request failed: You are trying to withdraw more cash than you have in localbitcoinplusplus account.";
err_response = {
user_flo_addr: params.trader_flo_address,
msg: err_msg
@ -16893,192 +17093,17 @@
reactor.dispatchEvent('message_for_user', err_response);
throw new Error(err_msg);
}
const encoded_bank_details = localbitcoinplusplus.encrypt.encryptMessage(
bank_details,
getAPaymentHandler
);
let token_transfer_currency = "";
if (params.currency == "INR") {
token_transfer_currency = "rupee";
}
//const flo_withdraw_comment = `transfer ${withdrawing_cash_amount} ${token_transfer_currency}# to ${params.trader_flo_address}.`;
const flo_withdraw_comment = `transfer ${withdrawing_cash_amount} ${token_transfer_currency}# to ${cashierFloAddr} for ${params.trader_flo_address}.`;
// Add it to cash withdrawal table
let withdraw_request_db_object = {
id: helper_functions.unique_id(),
trader_flo_address: params.trader_flo_address,
withdraw_amount: withdrawing_cash_amount,
currency: params.currency,
receivinAddress: encoded_bank_details,
cashier_pubKey: getAPaymentHandler,
status: 1 // withdraw request called
};
readDB("localbitcoinUser", "00-01").then(function (
su_data
) {
if (
typeof su_data == "object" &&
typeof su_data.myLocalFLOPublicKey ==
"string" &&
su_data.myLocalFLOPublicKey.length > 0 &&
localbitcoinplusplus.master_configurations.supernodesPubKeys.includes(
su_data.myLocalFLOPublicKey
)
) {
let withdraw_request_db_object_hash = Crypto.SHA256(
JSON.stringify(withdraw_request_db_object)
);
withdraw_request_db_object[
"withdrawDataHash"
] = withdraw_request_db_object_hash;
withdraw_request_db_object[
"order_validator_sign"
] = RM_WALLET.sign(
withdraw_request_db_object_hash,
localbitcoinplusplus.wallets
.MY_SUPERNODE_PRIVATE_KEY
);
withdraw_request_db_object[
"order_validator_public_key"
] = su_data.myLocalFLOPublicKey;
try {
// Transfer Token
RM_TRADE.sendMultipleInputsTransaction(
localbitcoinplusplus.BASE_BLOCKCHAIN,
[localbitcoinplusplus.wallets
.MY_SUPERNODE_PRIVATE_KEY],
cashierFloAddr,
0.01,
localbitcoinplusplus.wallets
.my_local_flo_address,
async function (res) {
console.log(res);
if (typeof res == "object") {
try {
let msg = "";
let resp_txid = "";
if (
typeof res.txid == "string" &&
res.txid.length > 0
) {
resp_obj = JSON.parse(res.txid);
resp_txid = resp_obj.txid.result || resp_obj.txid;
msg = `Transaction Id for token transfer to ${params.trader_flo_address}: ${resp_txid}.`;
} else {
console.log(res);
err_response = {
user_flo_addr: cashierFloAddr,
msg: `Failed to transfer token for withdraw order ${withdraw_request_db_object.id}`
}
reactor.dispatchEvent('message_for_user', err_response);
throw new Errror(`ERROR: Failed to transfer token for withdraw order ${withdraw_request_db_object.id}.`);
return false;
}
if (msg.length > 0) {
// Deduct balance of withdrawer
cash_balances_res.cash_balance -= helper_functions.truncateDecimals(
withdrawing_cash_amount, 2
);
const withdrawer_cash_data = await updateinDB(
"cash_balances",
cash_balances_res
);
const update_cash_balance_obj = {
withdrawer_cash_data: withdrawer_cash_data
};
const update_cash_balance_str = JSON.stringify(
update_cash_balance_obj
);
const update_cash_balance_hash = Crypto.SHA256(
update_cash_balance_str
);
const update_cash_balance_sign = RM_WALLET.sign(
update_cash_balance_hash,
localbitcoinplusplus.wallets.MY_SUPERNODE_PRIVATE_KEY
);
update_cash_balance_obj.publicKey =
localbitcoinplusplus.wallets.my_local_flo_public_key;
update_cash_balance_obj.sign = update_cash_balance_sign;
update_cash_balance_obj.hash = update_cash_balance_hash;
update_cash_balance_obj.trader_flo_address = cash_balances_res.trader_flo_address;
RM_RPC.send_rpc
.call(
this,
"update_all_new_cash_withdraw_recorded_in_db",
update_cash_balance_obj
)
.then(update_cash_balance_req =>
doSend(
update_cash_balance_req
)
);
//add the request to supernode db
withdraw_request_db_object.token_transfer_txid = resp_txid;
// Add record in Db
const withdraw_request_db_object_res = await addDB(
"withdraw_cash",
withdraw_request_db_object
);
// return back the response to client
withdraw_request_db_object_res.receiver_flo_address =
params.trader_flo_address;
withdraw_request_db_object_res.trader_flo_address =
params.trader_flo_address;
RM_RPC.send_rpc
.call(
this,
"withdrawal_request_response",
withdraw_request_db_object_res
)
.then(
withdrawal_request_response =>
doSend(
withdrawal_request_response
)
);
} else {
throw new Errror(
`ERROR: Failed to make transaction. Message length is 0: ${msg}`
);
return false;
}
} catch (e) {
throw new Error(e);
}
}
},
flo_withdraw_comment
);
} catch (error) {
console.log(error);
}
}
});
} else {
// Return error to the requester
err_msg =
"Withdrawal request failed: You are trying to withdraw more cash than you have in localbitcoinplusplus account.";
err_response = {
user_flo_addr: params.trader_flo_address,
msg: err_msg
}
reactor.dispatchEvent('message_for_user', err_response);
throw new Error(err_msg);
}
} catch(e) {
console.error(e);
updateinDB("cash_balances",
old_cash_balances_res,
old_cash_balances_res.id,
false, false
);
}
});
} else {
err_msg = "Unknown asset withdraw request error.";
@ -18604,243 +18629,264 @@
backup_server_db_instance
.backup_readDB("cash_balances", trader_cash_id)
.then(function (cash_balances_res) {
if (
typeof cash_balances_res == "object" &&
typeof cash_balances_res.trader_flo_address ==
"string" &&
typeof cash_balances_res.cash_balance ==
"number" &&
cash_balances_res.cash_balance > 0
) {
let withdrawer_cash_balance = helper_functions.truncateDecimals(
cash_balances_res.cash_balance, 2
);
let withdrawing_cash_amount = helper_functions.truncateDecimals(
params.withdrawing_amount, 2
);
let bank_details = params.receivinAddress.trim(); // user UPI
try {
if (
withdrawer_cash_balance > 0 &&
withdrawing_cash_amount > 0 &&
withdrawer_cash_balance >=
withdrawing_cash_amount
typeof cash_balances_res == "object" &&
typeof cash_balances_res.trader_flo_address ==
"string" &&
typeof cash_balances_res.cash_balance ==
"number" &&
cash_balances_res.cash_balance > 0
) {
// Get a cashier
const cashiersList = JSON.parse(
localbitcoinplusplus.master_configurations
.cashiers
let old_cash_balances_res = JSON.parse(JSON.stringify(cash_balances_res));
let withdrawer_cash_balance = helper_functions.truncateDecimals(
cash_balances_res.cash_balance, 2
);
const cashiersPubKeysArray = Object.keys(cashiersList);
const getAPaymentHandler = randomNoRepeats(cashiersPubKeysArray)();
const cashierFloAddr = bitjs[localbitcoinplusplus.BASE_BLOCKCHAIN].pubkey2address(
getAPaymentHandler
let withdrawing_cash_amount = helper_functions.truncateDecimals(
params.withdrawing_amount, 2
);
let bank_details = params.receivinAddress.trim(); // user UPI
if (!cashiersPubKeysArray.includes(
getAPaymentHandler
)
if (
withdrawer_cash_balance > 0 &&
withdrawing_cash_amount > 0 &&
withdrawer_cash_balance >=
withdrawing_cash_amount
) {
throw new Error(
`ERROR: ${getAPaymentHandler} is not recognized as any Cashier's Public Key.`
// Deduct balance of withdrawer
cash_balances_res.cash_balance -= helper_functions.truncateDecimals(
withdrawing_cash_amount, 2
);
const withdrawer_cash_data = await backup_server_db_instance.backup_updateinDB(
"cash_balances",
cash_balances_res
);
// Get a cashier
const cashiersList = JSON.parse(
localbitcoinplusplus.master_configurations
.cashiers
);
const cashiersPubKeysArray = Object.keys(cashiersList);
const getAPaymentHandler = randomNoRepeats(cashiersPubKeysArray)();
const cashierFloAddr = bitjs[localbitcoinplusplus.BASE_BLOCKCHAIN].pubkey2address(
getAPaymentHandler
);
}
const encoded_bank_details = localbitcoinplusplus.encrypt.encryptMessage(
bank_details,
getAPaymentHandler
);
if (!cashiersPubKeysArray.includes(
getAPaymentHandler
)
) {
throw new Error(
`ERROR: ${getAPaymentHandler} is not recognized as any Cashier's Public Key.`
);
}
let token_transfer_currency = "";
if (params.currency == "INR") {
token_transfer_currency = "rupee";
}
const encoded_bank_details = localbitcoinplusplus.encrypt.encryptMessage(
bank_details,
getAPaymentHandler
);
const flo_withdraw_comment = `transfer ${withdrawing_cash_amount} ${token_transfer_currency}# to ${params.trader_flo_address}.`;
let token_transfer_currency = "";
if (params.currency == "INR") {
token_transfer_currency = "rupee";
}
// Add it to cash withdrawal table
let withdraw_request_db_object = {
id: helper_functions.unique_id(),
trader_flo_address: params.trader_flo_address,
withdraw_amount: withdrawing_cash_amount,
currency: params.currency,
receivinAddress: encoded_bank_details,
cashier_pubKey: getAPaymentHandler,
status: 1 // withdraw request called
};
const flo_withdraw_comment = `transfer ${withdrawing_cash_amount} ${token_transfer_currency}# to ${params.trader_flo_address}.`;
readDB("localbitcoinUser", "00-01").then(
function (su_data) {
if (
typeof su_data == "object" &&
typeof su_data.myLocalFLOPublicKey ==
"string" &&
su_data.myLocalFLOPublicKey.length > 0 &&
localbitcoinplusplus.master_configurations.supernodesPubKeys.includes(
su_data.myLocalFLOPublicKey
)
) {
let withdraw_request_db_object_hash = Crypto.SHA256(
JSON.stringify(
withdraw_request_db_object
// Add it to cash withdrawal table
let withdraw_request_db_object = {
id: helper_functions.unique_id(),
trader_flo_address: params.trader_flo_address,
withdraw_amount: withdrawing_cash_amount,
currency: params.currency,
receivinAddress: encoded_bank_details,
cashier_pubKey: getAPaymentHandler,
status: 1 // withdraw request called
};
readDB("localbitcoinUser", "00-01").then(
function (su_data) {
if (
typeof su_data == "object" &&
typeof su_data.myLocalFLOPublicKey ==
"string" &&
su_data.myLocalFLOPublicKey.length > 0 &&
localbitcoinplusplus.master_configurations.supernodesPubKeys.includes(
su_data.myLocalFLOPublicKey
)
);
withdraw_request_db_object[
"withdrawDataHash"
] = withdraw_request_db_object_hash;
withdraw_request_db_object[
"order_validator_sign"
] = RM_WALLET.sign(
withdraw_request_db_object_hash,
localbitcoinplusplus.wallets
.MY_SUPERNODE_PRIVATE_KEY
);
withdraw_request_db_object[
"order_validator_public_key"
] = su_data.myLocalFLOPublicKey;
try {
// Transfer Token
RM_TRADE.sendMultipleInputsTransaction(
localbitcoinplusplus.BASE_BLOCKCHAIN,
[localbitcoinplusplus.wallets
.MY_SUPERNODE_PRIVATE_KEY],
cashierFloAddr,
0.01,
localbitcoinplusplus.wallets
.my_local_flo_address,
async function (res) {
console.log(res);
if (typeof res == "object") {
try {
let msg = "";
let resp_txid = "";
if (
typeof res.txid == "string" &&
res.txid.length > 0
) {
resp_obj = JSON.parse(
res.txid
);
resp_txid =
resp_obj.txid.result ||
resp_obj.txid;
msg = `Transaction Id for token transfer to ${params.trader_flo_address}: ${resp_txid}.`;
} else {
err_response = {
user_flo_addr: cashierFloAddr,
msg: `Failed to transfer token for withdraw id ${withdraw_request_db_object.id}`
}
reactor.dispatchEvent('message_for_user', err_response);
throw new Errror(
`ERROR: Failed to make transaction.`
);
return false;
}
if (msg.length > 0) {
// Deduct balance of withdrawer
cash_balances_res.cash_balance -= helper_functions.truncateDecimals(
withdrawing_cash_amount, 2
);
const withdrawer_cash_data = await backup_server_db_instance.backup_updateinDB(
"cash_balances",
cash_balances_res
);
const update_cash_balance_obj = {
withdrawer_cash_data: withdrawer_cash_data
};
const update_cash_balance_str = JSON.stringify(
update_cash_balance_obj
);
const update_cash_balance_hash = Crypto.SHA256(
update_cash_balance_str
);
const update_cash_balance_sign = RM_WALLET.sign(
update_cash_balance_hash,
localbitcoinplusplus.wallets
.MY_SUPERNODE_PRIVATE_KEY
);
update_cash_balance_obj.publicKey =
localbitcoinplusplus.wallets.my_local_flo_public_key;
update_cash_balance_obj.sign = update_cash_balance_sign;
update_cash_balance_obj.hash = update_cash_balance_hash;
update_cash_balance_obj.trader_flo_address = cash_balances_res.trader_flo_address;
RM_RPC.send_rpc
.call(
this,
"update_all_new_cash_withdraw_recorded_in_db",
update_cash_balance_obj
)
.then(
update_cash_balance_req =>
doSend(
update_cash_balance_req
)
);
//add the request to supernode db
withdraw_request_db_object.token_transfer_txid =
resp_txid ||
res.signedTxHash;
// Add record in Db
const withdraw_request_db_object_res = await backup_server_db_instance.backup_addDB(
"withdraw_cash",
withdraw_request_db_object
);
// return back the response to client
withdraw_request_db_object_res.receiver_flo_address =
params.trader_flo_address;
withdraw_request_db_object_res.trader_flo_address =
params.trader_flo_address;
RM_RPC.send_rpc
.call(
this,
"withdrawal_request_response",
withdraw_request_db_object_res
)
.then(
withdrawal_request_response =>
doSend(
withdrawal_request_response
)
);
} else {
throw new Errror(
`ERROR: Failed to make transaction. Message length is 0: ${msg}`
);
return false;
}
} catch (e) {
throw new Error(e);
}
}
},
flo_withdraw_comment
) {
let withdraw_request_db_object_hash = Crypto.SHA256(
JSON.stringify(
withdraw_request_db_object
)
);
} catch (error) {
console.log(error);
withdraw_request_db_object[
"withdrawDataHash"
] = withdraw_request_db_object_hash;
withdraw_request_db_object[
"order_validator_sign"
] = RM_WALLET.sign(
withdraw_request_db_object_hash,
localbitcoinplusplus.wallets
.MY_SUPERNODE_PRIVATE_KEY
);
withdraw_request_db_object[
"order_validator_public_key"
] = su_data.myLocalFLOPublicKey;
try {
// Transfer Token
RM_TRADE.sendMultipleInputsTransaction(
localbitcoinplusplus.BASE_BLOCKCHAIN,
[localbitcoinplusplus.wallets
.MY_SUPERNODE_PRIVATE_KEY],
cashierFloAddr,
0.01,
localbitcoinplusplus.wallets
.my_local_flo_address,
async function (res) {
console.log(res);
if (typeof res == "object") {
try {
let msg = "";
let resp_txid = "";
if (
typeof res.txid == "string" &&
res.txid.length > 0
) {
resp_obj = JSON.parse(
res.txid
);
resp_txid =
resp_obj.txid.result ||
resp_obj.txid;
msg = `Transaction Id for token transfer to ${params.trader_flo_address}: ${resp_txid}.`;
} else {
err_response = {
user_flo_addr: cashierFloAddr,
msg: `Failed to transfer token for withdraw id ${withdraw_request_db_object.id}`
}
reactor.dispatchEvent('message_for_user', err_response);
throw new Errror(
`ERROR: Failed to make transaction.`
);
return false;
}
if (msg.length > 0) {
const update_cash_balance_obj = {
withdrawer_cash_data: withdrawer_cash_data
};
const update_cash_balance_str = JSON.stringify(
update_cash_balance_obj
);
const update_cash_balance_hash = Crypto.SHA256(
update_cash_balance_str
);
const update_cash_balance_sign = RM_WALLET.sign(
update_cash_balance_hash,
localbitcoinplusplus.wallets
.MY_SUPERNODE_PRIVATE_KEY
);
update_cash_balance_obj.publicKey =
localbitcoinplusplus.wallets.my_local_flo_public_key;
update_cash_balance_obj.sign = update_cash_balance_sign;
update_cash_balance_obj.hash = update_cash_balance_hash;
update_cash_balance_obj.trader_flo_address = cash_balances_res.trader_flo_address;
RM_RPC.send_rpc
.call(
this,
"update_all_new_cash_withdraw_recorded_in_db",
update_cash_balance_obj
)
.then(
update_cash_balance_req =>
doSend(
update_cash_balance_req
)
);
//add the request to supernode db
withdraw_request_db_object.token_transfer_txid =
resp_txid ||
res.signedTxHash;
// Add record in Db
const withdraw_request_db_object_res = await backup_server_db_instance.backup_addDB(
"withdraw_cash",
withdraw_request_db_object
);
// return back the response to client
withdraw_request_db_object_res.receiver_flo_address =
params.trader_flo_address;
withdraw_request_db_object_res.trader_flo_address =
params.trader_flo_address;
RM_RPC.send_rpc
.call(
this,
"withdrawal_request_response",
withdraw_request_db_object_res
)
.then(
withdrawal_request_response =>
doSend(
withdrawal_request_response
)
);
} else {
throw new Errror(
`ERROR: Failed to make transaction. Message length is 0: ${msg}`
);
return false;
}
} catch (e) {
console.error(e);
backup_server_db_instance.backup_updateinDB("cash_balances",
old_cash_balances_res,
old_cash_balances_res.id,
false, false
);
}
}
},
flo_withdraw_comment
);
} catch (error) {
console.error(error);
backup_server_db_instance.backup_updateinDB("cash_balances",
old_cash_balances_res,
old_cash_balances_res.id,
false, false
);
}
}
}
);
} else {
// Return error to the requester
err_msg =
"Withdrawal request failed: You are trying to withdraw more cash than you have in localbitcoinplusplus account.";
err_response = {
user_flo_addr: params.trader_flo_address,
msg: err_msg
}
);
} else {
// Return error to the requester
err_msg =
"Withdrawal request failed: You are trying to withdraw more cash than you have in localbitcoinplusplus account.";
err_response = {
user_flo_addr: params.trader_flo_address,
msg: err_msg
reactor.dispatchEvent('message_for_user', err_response);
throw new Error(err_msg);
}
reactor.dispatchEvent('message_for_user', err_response);
throw new Error(err_msg);
}
} catch(e) {
console.error(e);
backup_server_db_instance.backup_updateinDB("cash_balances",
old_cash_balances_res,
old_cash_balances_res.id,
false, false
);
}
});
} else {
err_msg = "withdraw request error";