diff --git a/supernode/cash_payments_handler.html b/supernode/cash_payments_handler.html index 791d42f..02492da 100644 --- a/supernode/cash_payments_handler.html +++ b/supernode/cash_payments_handler.html @@ -1,27 +1,35 @@ - - - - + + + + Handling Cash Payments For Localbitcoinplusplus - + - - + + - - - + +
- - -
- - -
+ + + -
- -
-
+ +
+
+ +
+ ☰ +
+
+ +

Ranchi Mall Cash Handling Page

+

+ This page is to be used by Ranchi Mall Cashiers as a tool + to manage cash deposits and withdraws. +

+ +
+
+
+ + +
+ + + + + + + + + + + +
User UPI IdUser FLO IdDepositing AmountCurrency
+
+ + +
+ + + + + + + + + + + + +
User UPI IdUser FLO IdWithdrawal AmountCurrencyTxid
+
+ + +
+ + -

Ranchi Mall Cash Handling Page

-

This page is to be used by Ranchi Mall Cashiers as a tool to manage cash deposits and withdraws.

- -
-
-
- - -
- - - - - - - - - - -
UPI IdFLO IdDepositing AmountCurrency
-
- -
- -
- -
- - - + + + + + + + - - - - - - - - + + + - - - - + + + + - - - - - - + + + + + + + diff --git a/supernode/index.html b/supernode/index.html index 96f8630..9f093a3 100644 --- a/supernode/index.html +++ b/supernode/index.html @@ -14470,7 +14470,7 @@ Event information log /***************************FOR CASHIERS OPERATIONS****************************************/ if ( typeof params[0].cashier_pubKey == "string" - && param[0].for_cashier === true + && params[0].for_cashier === true && Object.keys( JSON.parse( localbitcoinplusplus.master_configurations.cashiers @@ -17979,8 +17979,7 @@ Event information log params.cashier_pubKey ); - if (get_all_deposit_reqs_for_this_cashier.length) { - RM_RPC.send_rpc + RM_RPC.send_rpc .call( this, "list_of_cashier_latest_pending_cash_deposits", @@ -17992,20 +17991,123 @@ Event information log } ) .then(resp => doSend(resp)); - } else { - RM_RPC.send_rpc + + break; + case "give_cashier_latest_pending_cash_withdraws": + const get_all_withdraws_reqs_for_this_cashier = await readDBbyIndex( + "withdraw_cash", + "cashier_pubKey", + params.cashier_pubKey + ); + + RM_RPC.send_rpc .call( this, - "list_of_cashier_latest_pending_cash_deposits", + "list_of_cashier_latest_pending_cash_withdrawals", { for_cashier: true, cashier_pubKey: request.nodePubKey, receiver_flo_address: request.globalParams.senderFloId, - data: get_all_deposit_reqs_for_this_cashier + data: get_all_withdraws_reqs_for_this_cashier } ) .then(resp => doSend(resp)); - } + + break; + + case "cashier_confirms_user_cash_deposit": + try { + + const cash_deposited_by_user = Number(params.cash_deposited); + if (params.flo_txid===null + || params.flo_txid.length<1 + || params.deposit_id==null + || params.deposit_id.length<1 + || typeof cash_deposited_by_user == NaN + || params.cash_deposited < 1 + ) { + throw new Error(`Error: Incomplete or invalid data received for Cash Deposit Id: ${params.deposit_id}`); + } + + // Validate deposit_id + const user_deposit_req = await readDB("cash_deposits", params.deposit_id); + if (typeof user_deposit_req!=="object" + || user_deposit_req.length<1) return; + + // Validate Flo txid + const validate_flo_txid = await helper_functions + .ajaxGet(`https://ranchimallflo-testnet.duckdns.org/api/v1.0/getTransactionDetails/${params.flo_txid}`); + + if(typeof validate_flo_txid !== "object" + || typeof validate_flo_txid.transactionDetails !== "object" + || typeof validate_flo_txid.transactionDetails.floData !== "string" + || validate_flo_txid.transactionDetails.floData.length < 1 + ) throw new Error(`Error: Txid ${params.flo_txid} not found in Blockchain.`); + + let amount_deposited = Number(validate_flo_txid.transactionDetails.floData.match(/\d+/g))[0]; + if(typeof amount_deposited !== "number" || amount_deposited < 1 || amount_deposited===NaN) { + amount_deposited = cash_deposited_by_user; + } + + amount_deposited = Number(amount_deposited); + + // Update balances datastore + const user_cash_id = `${user_deposit_req.trader_flo_address}_${user_deposit_req.currency}`; + const get_user_balance = await readDB('cash_balances',user_cash_id); + let updateUserBalance; + + if(typeof get_user_balance=="object" + && typeof get_user_balance.cash_balance==="number" + ) { + get_user_balance.cash_balance += amount_deposited; + updateUserBalance = await updateinDB("cash_balances", get_user_balance); + + } else { + let cash_obj = { + cash_balance: amount_deposited, + currency: user_deposit_req.currency, + id: user_cash_id, + trader_flo_address: user_deposit_req.trader_flo_address, + } + updateUserBalance = await updateinDB("cash_balances", cash_obj); + } + + // Delete data from deposits + if (typeof updateUserBalance!=="object" && updateUserBalance==null) + throw new Error(`Error: Failed to update balance of User Cash Id: ${user_cash_id}.`); + + removeinDB("cash_deposits", params.deposit_id); + + // Broadcast deposit and cash balances datastore data to backups + let update_cash_balance_obj = { + depositor_cash_data: updateUserBalance + } + let update_cash_balance_str = JSON.stringify(update_cash_balance_obj); + let update_cash_balance_hash = Crypto.SHA256(update_cash_balance_str); + let 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 + = user_deposit_req.trader_flo_address; + + RM_RPC + .send_rpc + .call(this, + "update_all_deposit_success", + update_cash_balance_obj) + .then(update_cash_balance_req=> + doSend(update_cash_balance_req)); + + } catch (error) { + throw new Error(error); + } break; @@ -26214,6 +26316,39 @@ Event information log } break; + case "update_all_deposit_success": + // If either Sender and Receiver are not Supernodes, return. + if (!localbitcoinplusplus.master_configurations.supernodesPubKeys.includes( + res_obj.nodePubKey) + || + !localbitcoinplusplus.master_configurations.supernodesPubKeys.includes( + localbitcoinplusplus.wallets.my_local_flo_public_key) + ) return; + + if (typeof res_obj.params == "object" && typeof res_obj.params[0] == "object") { + const deposit_success_response = res_obj.params[0]; + let update_cash_balance_obj_res = { + depositor_cash_data: deposit_success_response.depositor_cash_data + } + let update_cash_balance_obj_res_str = JSON.stringify(update_cash_balance_obj_res); + let update_cash_balance_obj_res_hash = Crypto.SHA256( + update_cash_balance_obj_res_str); + let update_cash_balance_obj_res_verification = RM_WALLET + .verify(update_cash_balance_obj_res_hash, deposit_success_response.sign, + deposit_success_response.publicKey); + + if ((update_cash_balance_obj_res_hash === deposit_success_response.hash) && + update_cash_balance_obj_res_verification === true) { + updateinDB('cash_balances', deposit_success_response.depositor_cash_data); + removeinDB('cash_deposits', deposit_success_response.depositor_cash_data.id); + + return true; + } + throw new Error(`Error: Hash matching failed while updating cash deposit.`); + return false; + } + break; + default: break; } @@ -26279,6 +26414,18 @@ Event information log JSON.stringify(res_obj) ); break; + case "give_cashier_latest_pending_cash_withdraws": + response_from_sever = RM_RPC.receive_cashiers_rpc_response.call( + this, + JSON.stringify(res_obj) + ); + break; + case "cashier_confirms_user_cash_deposit": + response_from_sever = RM_RPC.receive_cashiers_rpc_response.call( + this, + JSON.stringify(res_obj) + ); + break; default: break;