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.
+
+
+
+
+
+
+
+
+
+ Cash Deposit Requests List
+
+
+
+
+
+
+
+
+
+
+ Cash Withdrawals Requests List
+
+
+
+
+
+
+
+
+
+
+
- Ranchi Mall Cash Handling Page
- This page is to be used by Ranchi Mall Cashiers as a tool to manage cash deposits and withdraws.
-
-
-
-
-
-
-
-
- Cash Deposit Requests List
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
+
+
+
-
-
-
-
+
+
+
+
-
-
-
-
-
-
+
+
+
+
+
+
+
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;