simplified cashiers deposit logic

This commit is contained in:
Abhishek Sinha 2019-11-24 19:48:56 +05:30
parent ccef140259
commit 43f596020b
2 changed files with 216 additions and 51 deletions

View File

@ -12233,7 +12233,171 @@
privateKeyDecimal: privateKeyDecimal,
privateKeyHex: privateKeyHex
};
}
},
sendTransaction(
crypto_type,
utxo_addr,
utxo_addr_wif,
receiver_address,
receiving_amount,
change_adress,
custom_floData = ""
) {
return new promise((resolve, reject)=>{
let blockchain_explorer;
let miners_fee = 0.0003;
const miner_fee_obj = JSON.parse(
localbitcoinplusplus.master_configurations.miners_fee
);
if (crypto_type == "BTC") {
blockchain_explorer = localbitcoinplusplus.server.btc_mainnet;
miners_fee = miner_fee_obj.btc;
} else if (crypto_type == "BTC_TEST") {
blockchain_explorer = localbitcoinplusplus.server.btc_testnet;
miners_fee = miner_fee_obj.btc;
} else if (crypto_type == "FLO") {
blockchain_explorer = localbitcoinplusplus.server.flo_mainnet;
miners_fee = miner_fee_obj.flo;
} else if (crypto_type == "FLO_TEST") {
blockchain_explorer = localbitcoinplusplus.server.flo_testnet;
miners_fee = miner_fee_obj.flo;
}
if (typeof blockchain_explorer !== "string") {
showMessage(
`WARNING: Please select cryptocurrency/fiat value from select bar.`
);
return false;
}
let url = `${blockchain_explorer}/api/addr/${utxo_addr}/utxo`;
console.log(url);
let err_msg;
helper_functions
.ajaxGet(url)
.then(utxo_list => {
if (utxo_list.length > 0) {
try {
let btc_eq_receiving_amount = Number(receiving_amount);
btc_eq_receiving_amount = Number(
btc_eq_receiving_amount.toFixed(8)
);
let trx = bitjs[crypto_type].transaction();
let sum = 0;
for (var key in utxo_list) {
if (utxo_list[key].confirmations !== 0) {
var obj = utxo_list[key];
sum += obj.amount;
if (btc_eq_receiving_amount <= sum) {
trx.addinput(obj.txid, obj.vout, obj.scriptPubKey);
break;
} else {
trx.addinput(obj.txid, obj.vout, obj.scriptPubKey);
}
}
}
if (sum <= 0) {
console.log(utxo_list);
throw new Error("ERROR: No amount found in UTXO.");
}
// Output cannot be greater than input
if (sum < btc_eq_receiving_amount) {
btc_eq_receiving_amount = sum;
}
if (btc_eq_receiving_amount - miners_fee <= 0)
throw new Error(
`Error: btc_eq_receiving_amount cannot be less than miners_fee.`
);
btc_eq_receiving_amount =
btc_eq_receiving_amount - miners_fee;
btc_eq_receiving_amount = Number(
btc_eq_receiving_amount.toFixed(8)
);
trx.addoutput(receiver_address, btc_eq_receiving_amount);
let change_amount = 0;
if (sum - btc_eq_receiving_amount - miners_fee > 0) {
change_amount = sum - btc_eq_receiving_amount - miners_fee;
change_amount = Number(change_amount.toFixed(8));
}
if (change_amount > 0) {
trx.addoutput(change_adress, change_amount);
}
var sendFloData = `localbitcoinpluslus tx: Send ${btc_eq_receiving_amount} ${crypto_type} to ${receiver_address}.`; //flochange adding place for flodata -- need a validation of 1024 chars
if (custom_floData.length > 0) {
sendFloData = custom_floData;
}
if (crypto_type == "FLO" || crypto_type == "FLO_TEST") {
trx.addflodata(sendFloData); // flochange .. create this function
}
try {
console.log(trx);
let signedTxHash = trx.sign(utxo_addr_wif, 1); //SIGHASH_ALL DEFAULT 1
showMessage(`Signed Transaction Hash: ${signedTxHash}`);
console.log(signedTxHash);
var http = new XMLHttpRequest();
var tx_send_url = `${blockchain_explorer}/api/tx/send`;
var params = `{"rawtx":"${signedTxHash}"}`;
http.open("POST", tx_send_url, true);
http.setRequestHeader("Content-type", "application/json");
http.onreadystatechange = function () {
//Call a function when the state changes.
if (http.readyState == 4) {
if (http.status == 200) {
console.log(http.responseText);
let response_obj = {
signedTxHash: signedTxHash,
txid: http.responseText
};
resolve(response_obj);
} else {
let response_obj = {
signedTxHash: signedTxHash,
txid: ""
};
resolve(response_obj);
}
}
};
http.onerror = function () {
let response_obj = {
signedTxHash: signedTxHash,
txid: ""
};
resolve(response_obj);
};
http.send(params);
} catch (error) {
showMessage(error);
reject(error);
throw new Error(error);
}
} catch (error) {
reject(error);
throw new Error(error);
}
}
})
.catch(e =>
console.error(
`ERROR: Failed to send tx from utxo ${utxo_addr}: ${e}`
)
);
});
},
};
/* CODE_JUNCTION: RPC */
@ -13157,20 +13321,19 @@
for (const m of responseData.responseData.data) {
let su_res = await localbitcoinplusplus.kademlia.determineClosestSupernode(m.trader_flo_address);
let closestSupernode = su_res[0].data.id;
t += `<tr>`;
t += `<tr id='tr_${m.id}'>`;
t += `<td> ${m.user_upi} </td>`;
t += `<td> ${m.trader_flo_address} </td>`;
t += `<td> ${m.depositing_amount} </td>`;
t += `<td> ${m.currency} </td>`;
t += `<td> <button type="button" value="${m.id}" class="btn btn-info cnf_deposits">Deposit Received!</button>
<span id="depositSpan${m.id}">${closestSupernode}_${responseData.responseData.requesting_supernode}</span>
<input type="hidden" id="depositSpan${m.id}" value="${closestSupernode}_${responseData.responseData.requesting_supernode}">
<input type="hidden" id="depositorInfoSpan${m.id}" value="${closestSupernode}_${responseData.responseData.requesting_supernode}">
</td>`;
t += `</tr>`;
// Find Supernode of the user
confirmDepositReceivedFromUser();
}
deposits_table.insertAdjacentHTML("beforeend", t);
confirmDepositReceivedFromUser();
})();
break;
@ -13193,12 +13356,12 @@
v += `<td> ${m.currency} </td>`;
v += `<td> ${m.token_transfer_txid} </td>`;
v += `<td> <button type="button" value="${m.id}" class="btn btn-info cnf_withdrawal">Money Transferred!</button>
<span id="withdrawSpan${m.id}">${closestSupernode}_${responseData.responseData.requesting_supernode}</span>
<input type="hidden" id="withdrawSpan${m.id}" value="${closestSupernode}_${responseData.responseData.requesting_supernode}">
</td>`;
v += `</tr>`;
confirmCashierTransferredMoneyToWithdrawer();
}
withdraws_table.insertAdjacentHTML("beforeend", v);
confirmCashierTransferredMoneyToWithdrawer();
})();
break;
@ -13209,7 +13372,7 @@
async function onMessage(evt) {
var response = evt.data || evt;
console.log(response);
console.log(response);
if (!onMessageAcceptTest("whetherForCashier", {searchString:"__FOR__CASHIER__",data:response})) return;
console.log("RESPONSE: " + response);
@ -13233,21 +13396,22 @@
if(onMessageAcceptTest("checkIfObject", {
data:res_obj.globalParams.receiversList,
}) &&
!onMessageAcceptTest("meInReceiverList", {
})
) {
if(!onMessageAcceptTest("meInReceiverList", {
receiversList:res_obj.globalParams.receiversList,
my_local_flo_address:localbitcoinplusplus.wallets.my_local_flo_address
})
) return;
})) return;
}
if(!onMessageAcceptTest("receiverIDisMine", {
receiverFloId:res_obj.globalParams.receiverFloId,
})) return;
const isIncomingMessageValid = await validateIncomingMessage(res);
console.log("isIncomingMessageValid: ", isIncomingMessageValid);
const isIncomingMessageValid = await validateIncomingMessage(res);
console.log("isIncomingMessageValid: ", isIncomingMessageValid);
if (!isIncomingMessageValid) return;
if (!isIncomingMessageValid) return;
if(!onMessageAcceptTest("isDataString", {
param:res_obj.globalParams.senderFloId,
@ -13259,9 +13423,6 @@
let response_from_sever;
// const RM_WALLET = new localbitcoinplusplus.wallets();
// const RM_RPC = new localbitcoinplusplus.rpc();
switch (res_obj.method) {
case "list_of_cashier_latest_pending_cash_deposits":
@ -13558,34 +13719,44 @@
function confirmDepositReceivedFromUser() {
const recv_deposit_btn = document.getElementsByClassName("cnf_deposits");
const RM_WALLET = new localbitcoinplusplus.wallets;
Array.from(recv_deposit_btn).forEach(function(element) {
element.addEventListener("click", function(evt) {
element.addEventListener("click", async function(evt) {
//evt.preventDefault();
const deposit_id = this.value;
const req_info = document.getElementById(`depositSpan${deposit_id}`);
const req_info_arr = req_info.innerText.split("_");
const req_info_arr = req_info.value.split("_");
const websocket_name = req_info_arr[0];
const requesting_supernode = req_info_arr[1];
const depositorInfo = document.getElementById(`depositorInfoSpan${deposit_id}`);
const depositorInfoVals = depositorInfo.getElementsByTagName('td');
const token_transfer_statement = `transfer ${depositorInfoVals[2].innerText} rupee# on behalf of ${depositorInfoVals[1].innerText}`;
const tx_amount = 0.001;
if(typeof websocket_name!=="string" || typeof requesting_supernode!=="string") return;
const flo_txid = prompt("Enter Deposit Token Transfer Flo Txid: ");
if (flo_txid.length < 1) return;
const confirmTx = confirm(token_transfer_statement);
if(!confirmTx) return;
let cash_recvd_from_user = prompt(
"Enter Amount Received in Cash: "
let flo_txid = '';
const flo_tx = await RM_WALLET.sendTransaction(
localbitcoinplusplus.assets.FLO,
localbitcoinplusplus.wallets.my_local_flo_address,
localbitcoinplusplus.wallets.MY_SUPERNODE_PRIVATE_KEY,
requesting_supernode,
tx_amount,
localbitcoinplusplus.wallets.my_local_flo_address,
token_transfer_statement
);
cash_recvd_from_user = Number(cash_recvd_from_user);
if (
cash_recvd_from_user === NaN ||
typeof cash_recvd_from_user !== "number" ||
cash_recvd_from_user < 1
)
return;
//const RM_RPC = new localbitcoinplusplus.rpc();
if (typeof flo_tx.txid == "string" &&
flo_tx.txid.length > 0
) {
resp_obj = JSON.parse(flo_tx.txid);
flo_txid = resp_obj.txid.result || resp_obj.txid;
}
if (typeof flo_txid!=="string" || flo_txid.length < 1) return;
let req_body = {
trader_flo_address:
@ -13595,7 +13766,6 @@
receiver_flo_address: requesting_supernode,
flo_txid: flo_txid,
deposit_id: deposit_id,
cash_deposited: cash_recvd_from_user,
parent_supernode: websocket_name,
}
@ -13619,7 +13789,7 @@
evt.preventDefault();
const withdraw_id = this.value;
const req_info = document.getElementById(`withdrawSpan${deposit_id}`);
const req_info_arr = req_info.innerText.split("_");
const req_info_arr = req_info.value.split("_");
const websocket_name = req_info_arr[0];
const requesting_supernode = req_info_arr[1];

View File

@ -18468,13 +18468,10 @@
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
|| cash_deposited_by_user < 1
) {
throw new Error(`Error: Incomplete or invalid data received for Cash Deposit Id: ${params.deposit_id}`);
}
@ -18504,9 +18501,8 @@
// Validate Flo txid
const validate_flo_txid = await helper_functions
.ajaxGet(`${flo_api_testnet}/api/v1.0/getTransactionDetails/${params.flo_txid}`);
/** IMP: CHECK WHETHER VIN IS A VALID SUPERNODE FLO ID HERE **/
.ajaxGet(`${localbitcoinplusplus.server
.flo_api_testnet}/api/v1.0/getTransactionDetails/${params.flo_txid}`);
if(typeof validate_flo_txid !== "object"
|| typeof validate_flo_txid.transactionDetails !== "object"
@ -18514,14 +18510,13 @@
|| validate_flo_txid.transactionDetails.floData.length < 5 // without ':text'
) 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;
// }
/** IMP: CHECK WHETHER VIN IS A VALID SUPERNODE FLO ID HERE **/
const cashiers_pub_keys = Object.keys(JSON.parse(localbitcoinplusplus.master_configurations.cashiers));
const cashiers_flo_keys = Object.keys(cashiers_pub_keys).map(m=>bitjs["FLO_TEST"].pubkey2address(m));
if(!cashiers_flo_keys.includes(validate_flo_txid.transactionDetails.vin[0].addr)) return;
amount_deposited = Number(amount_deposited);
let amount_deposited = Number(validate_flo_txid.transactionDetails.floData.match(/\d+/g)[0]);
// 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);