simplified cashiers deposit logic
This commit is contained in:
parent
ccef140259
commit
43f596020b
@ -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];
|
||||
|
||||
|
||||
@ -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);
|
||||
|
||||
Loading…
Reference in New Issue
Block a user