fixed deposit, buy, sell issues
This commit is contained in:
parent
515f9ad9f0
commit
1475d96ebe
@ -11234,7 +11234,8 @@
|
|||||||
await readAllDB("deposit").then(function (res) {
|
await readAllDB("deposit").then(function (res) {
|
||||||
if (typeof res == "object" && res.length > 0) {
|
if (typeof res == "object" && res.length > 0) {
|
||||||
let canUserTrade = res.map(function (user) {
|
let canUserTrade = res.map(function (user) {
|
||||||
return respective_trader_id == user.trader_flo_address;
|
return (respective_trader_id == user.trader_flo_address
|
||||||
|
&& user.status==1);
|
||||||
});
|
});
|
||||||
if (canUserTrade.includes(true)) {
|
if (canUserTrade.includes(true)) {
|
||||||
request.response =
|
request.response =
|
||||||
@ -14662,7 +14663,7 @@
|
|||||||
let sell_order_crypto_equivalent = 0;
|
let sell_order_crypto_equivalent = 0;
|
||||||
user_sell_orders.map(sell_orders => {
|
user_sell_orders.map(sell_orders => {
|
||||||
sell_order_crypto_eq = RM_TRADE.calculateCryptoEquivalentOfCash(
|
sell_order_crypto_eq = RM_TRADE.calculateCryptoEquivalentOfCash(
|
||||||
sell_orders.sell_price, sell_orders.currency, sell_orders.product);
|
sell_orders.buy_price, sell_orders.currency, sell_orders.product);
|
||||||
sell_order_crypto_equivalent += Number(sell_order_crypto_eq);
|
sell_order_crypto_equivalent += Number(sell_order_crypto_eq);
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -15237,56 +15238,16 @@
|
|||||||
case "trade_buy_request_response":
|
case "trade_buy_request_response":
|
||||||
if (typeof res_obj.params !== "object"
|
if (typeof res_obj.params !== "object"
|
||||||
|| typeof res_obj.params[0] !== "object") return;
|
|| typeof res_obj.params[0] !== "object") return;
|
||||||
let trade_buy_res_data = res_obj.params[0];
|
let buyOrders_data = res_obj.params[0];
|
||||||
RM_RPC.filter_legit_backup_requests(trade_buy_res_data.trader_flo_address,
|
|
||||||
function (is_valid_request) {
|
|
||||||
|
|
||||||
if(!is_valid_request) return false;
|
|
||||||
|
|
||||||
if (typeof res_obj.params == "object" && typeof res_obj.params[0] == "object") {
|
|
||||||
let buyOrders_data = res_obj.params[0];
|
|
||||||
|
|
||||||
if (typeof localbitcoinplusplus.master_configurations.supernodesPubKeys == "object" &&
|
if (typeof localbitcoinplusplus.master_configurations.supernodesPubKeys == "object" &&
|
||||||
localbitcoinplusplus.master_configurations.supernodesPubKeys.includes(
|
localbitcoinplusplus.master_configurations.supernodesPubKeys.includes(
|
||||||
buyOrders_data.supernodePubKey)) {
|
buyOrders_data.supernodePubKey)) {
|
||||||
let isDataSignedBySuperNode = RM_WALLET
|
|
||||||
.verify(buyOrders_data.data_hash, buyOrders_data.supernode_sign,
|
|
||||||
buyOrders_data.supernodePubKey);
|
|
||||||
if (isDataSignedBySuperNode === true) {
|
|
||||||
|
|
||||||
const backup_server_db_instance = localbitcoinplusplus.newBackupDatabase.db[res_obj.globalParams.senderFloId];
|
|
||||||
|
|
||||||
if(typeof backup_server_db_instance !== "object") {
|
|
||||||
let backup_db_error_msg = `WARNING: Unknown DB instance. DB Backup failed.`;
|
|
||||||
showMessage(backup_db_error_msg);
|
|
||||||
throw new Error(backup_db_error_msg);
|
|
||||||
};
|
|
||||||
|
|
||||||
// Add buy order
|
|
||||||
backup_server_db_instance.backup_addDB("buyOrders", buyOrders_data).then(() => {
|
|
||||||
showMessage(`Your buy order is placed successfully.`);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
break;
|
|
||||||
case "trade_sell_request_response":
|
|
||||||
if (typeof res_obj.params !== "object"
|
|
||||||
|| typeof res_obj.params[0] !== "object") return;
|
|
||||||
let trade_sell_res_data = res_obj.params[0];
|
|
||||||
RM_RPC.filter_legit_backup_requests(trade_buy_res_data.trader_flo_address,
|
|
||||||
function (is_valid_request) {
|
|
||||||
if(!is_valid_request) return false;
|
|
||||||
if (typeof res_obj.params == "object" && typeof res_obj.params[0] == "object") {
|
|
||||||
let sellOrders_data = res_obj.params[0];
|
|
||||||
if (typeof localbitcoinplusplus.master_configurations.supernodesPubKeys == "object" &&
|
|
||||||
localbitcoinplusplus.master_configurations.supernodesPubKeys
|
|
||||||
.includes(sellOrders_data.supernodePubKey)) {
|
|
||||||
let isDataSignedBySuperNode = RM_WALLET
|
let isDataSignedBySuperNode = RM_WALLET
|
||||||
.verify(sellOrders_data.data_hash, sellOrders_data.supernode_sign,
|
.verify(buyOrders_data.data_hash, buyOrders_data.supernode_sign,
|
||||||
sellOrders_data.supernodePubKey);
|
buyOrders_data.supernodePubKey);
|
||||||
if (isDataSignedBySuperNode === true) {
|
if (isDataSignedBySuperNode === true) {
|
||||||
|
|
||||||
const backup_server_db_instance = localbitcoinplusplus.newBackupDatabase.db[res_obj.globalParams.senderFloId];
|
const backup_server_db_instance = localbitcoinplusplus.newBackupDatabase.db[res_obj.globalParams.senderFloId];
|
||||||
|
|
||||||
if(typeof backup_server_db_instance !== "object") {
|
if(typeof backup_server_db_instance !== "object") {
|
||||||
@ -15296,13 +15257,37 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Add buy order
|
// Add buy order
|
||||||
backup_server_db_instance.backup_addDB("sellOrders", sellOrders_data).then(() => {
|
backup_server_db_instance.backup_addDB("buyOrders", buyOrders_data).then(() => {
|
||||||
showMessage(`Your sell order is placed successfully.`);
|
showMessage(`Your buy order is placed successfully.`);
|
||||||
});;
|
});
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
break;
|
||||||
|
case "trade_sell_request_response":
|
||||||
|
if (typeof res_obj.params == "object" && typeof res_obj.params[0] == "object") {
|
||||||
|
let sellOrders_data = res_obj.params[0];
|
||||||
|
if (typeof localbitcoinplusplus.master_configurations.supernodesPubKeys == "object" &&
|
||||||
|
localbitcoinplusplus.master_configurations.supernodesPubKeys
|
||||||
|
.includes(sellOrders_data.supernodePubKey)) {
|
||||||
|
let isDataSignedBySuperNode = RM_WALLET
|
||||||
|
.verify(sellOrders_data.data_hash, sellOrders_data.supernode_sign,
|
||||||
|
sellOrders_data.supernodePubKey);
|
||||||
|
if (isDataSignedBySuperNode === true) {
|
||||||
|
const backup_server_db_instance = localbitcoinplusplus.newBackupDatabase.db[res_obj.globalParams.senderFloId];
|
||||||
|
|
||||||
|
if(typeof backup_server_db_instance !== "object") {
|
||||||
|
let backup_db_error_msg = `WARNING: Unknown DB instance. DB Backup failed.`;
|
||||||
|
showMessage(backup_db_error_msg);
|
||||||
|
throw new Error(backup_db_error_msg);
|
||||||
|
};
|
||||||
|
|
||||||
|
// Add buy order
|
||||||
|
backup_server_db_instance.backup_addDB("sellOrders", sellOrders_data).then(() => {
|
||||||
|
showMessage(`Your sell order is placed successfully.`);
|
||||||
|
});;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "deposit_asset_request_response":
|
case "deposit_asset_request_response":
|
||||||
@ -15920,24 +15905,19 @@
|
|||||||
if (typeof res_obj.params == "object" && typeof res_obj.params[0] == "object") {
|
if (typeof res_obj.params == "object" && typeof res_obj.params[0] == "object") {
|
||||||
let buyOrders_data = res_obj.params[0];
|
let buyOrders_data = res_obj.params[0];
|
||||||
|
|
||||||
RM_RPC.filter_legit_requests(params.trader_flo_address,
|
if (typeof localbitcoinplusplus.master_configurations.supernodesPubKeys == "object" &&
|
||||||
function (is_valid_request) {
|
localbitcoinplusplus.master_configurations.supernodesPubKeys.includes(
|
||||||
if (is_valid_request !== true) return false;
|
buyOrders_data.supernodePubKey)) {
|
||||||
|
let isDataSignedBySuperNode = RM_WALLET
|
||||||
if (typeof localbitcoinplusplus.master_configurations.supernodesPubKeys == "object" &&
|
.verify(buyOrders_data.data_hash, buyOrders_data.supernode_sign,
|
||||||
localbitcoinplusplus.master_configurations.supernodesPubKeys.includes(
|
buyOrders_data.supernodePubKey);
|
||||||
buyOrders_data.supernodePubKey)) {
|
if (isDataSignedBySuperNode === true) {
|
||||||
let isDataSignedBySuperNode = RM_WALLET
|
// Add buy order
|
||||||
.verify(buyOrders_data.data_hash, buyOrders_data.supernode_sign,
|
addDB("buyOrders", buyOrders_data).then(() => {
|
||||||
buyOrders_data.supernodePubKey);
|
showMessage(`Your buy order is placed successfully.`);
|
||||||
if (isDataSignedBySuperNode === true) {
|
});
|
||||||
// Add buy order
|
|
||||||
addDB("buyOrders", buyOrders_data).then(() => {
|
|
||||||
showMessage(`Your buy order is placed successfully.`);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
});
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case "trade_sell":
|
case "trade_sell":
|
||||||
@ -15947,24 +15927,20 @@
|
|||||||
case "trade_sell_request_response":
|
case "trade_sell_request_response":
|
||||||
if (typeof res_obj.params == "object" && typeof res_obj.params[0] == "object") {
|
if (typeof res_obj.params == "object" && typeof res_obj.params[0] == "object") {
|
||||||
let sellOrders_data = res_obj.params[0];
|
let sellOrders_data = res_obj.params[0];
|
||||||
RM_RPC.filter_legit_requests(params.trader_flo_address,
|
if (typeof localbitcoinplusplus.master_configurations.supernodesPubKeys == "object" &&
|
||||||
function (is_valid_request) {
|
localbitcoinplusplus.master_configurations.supernodesPubKeys.includes(
|
||||||
if (is_valid_request !== true) return false;
|
sellOrders_data
|
||||||
if (typeof localbitcoinplusplus.master_configurations.supernodesPubKeys == "object" &&
|
.supernodePubKey)) {
|
||||||
localbitcoinplusplus.master_configurations.supernodesPubKeys.includes(
|
let isDataSignedBySuperNode = RM_WALLET
|
||||||
sellOrders_data
|
.verify(sellOrders_data.data_hash, sellOrders_data.supernode_sign,
|
||||||
.supernodePubKey)) {
|
sellOrders_data.supernodePubKey);
|
||||||
let isDataSignedBySuperNode = RM_WALLET
|
if (isDataSignedBySuperNode === true) {
|
||||||
.verify(sellOrders_data.data_hash, sellOrders_data.supernode_sign,
|
// Add buy order
|
||||||
sellOrders_data.supernodePubKey);
|
addDB("sellOrders", sellOrders_data).then(() => {
|
||||||
if (isDataSignedBySuperNode === true) {
|
showMessage(`Your sell order is placed successfully.`);
|
||||||
// Add buy order
|
});;
|
||||||
addDB("sellOrders", sellOrders_data).then(() => {
|
|
||||||
showMessage(`Your sell order is placed successfully.`);
|
|
||||||
});;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
});
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case "sync_with_supernode":
|
case "sync_with_supernode":
|
||||||
@ -16484,7 +16460,7 @@
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case "refresh_deposit_status_request":
|
case "refresh_deposit_status_request":
|
||||||
RM_RPC.filter_legit_requests((is_valid_request) => {
|
RM_RPC.filter_legit_requests(res_obj.params[0].trader_flo_address, is_valid_request => {
|
||||||
if (is_valid_request !== true) return false;
|
if (is_valid_request !== true) return false;
|
||||||
readDBbyIndex("deposit", 'status', 1).then(function (res) {
|
readDBbyIndex("deposit", 'status', 1).then(function (res) {
|
||||||
res.map(function (deposit_trade) {
|
res.map(function (deposit_trade) {
|
||||||
@ -16562,7 +16538,7 @@
|
|||||||
|
|
||||||
case "updateUserCryptoBalanceRequest":
|
case "updateUserCryptoBalanceRequest":
|
||||||
let updateUserCryptoBalanceResponseObject = res_obj.params[0];
|
let updateUserCryptoBalanceResponseObject = res_obj.params[0];
|
||||||
let SuPubKey = readDB(userPublicData, updateUserCryptoBalanceResponseObject.trader_flo_address)
|
let SuPubKey = readDB('userPublicData', updateUserCryptoBalanceResponseObject.trader_flo_address)
|
||||||
.then(user_data => {
|
.then(user_data => {
|
||||||
if (typeof user_data !== "object" || user_data.supernode_flo_public_key.length <
|
if (typeof user_data !== "object" || user_data.supernode_flo_public_key.length <
|
||||||
1)
|
1)
|
||||||
@ -16942,26 +16918,21 @@
|
|||||||
let buyOrders_data = res_obj.params[0];
|
let buyOrders_data = res_obj.params[0];
|
||||||
|
|
||||||
// Only the relevent user node should get response
|
// Only the relevent user node should get response
|
||||||
if(res_obj.params[0].trader_flo_address !== localbitcoinplusplus.wallets.my_local_flo_address) return;
|
if(buyOrders_data.trader_flo_address !== localbitcoinplusplus.wallets.my_local_flo_address) return;
|
||||||
|
|
||||||
RM_RPC.filter_legit_requests(params.trader_flo_address,
|
if (typeof localbitcoinplusplus.master_configurations.supernodesPubKeys == "object" &&
|
||||||
function (is_valid_request) {
|
localbitcoinplusplus.master_configurations.supernodesPubKeys.includes(
|
||||||
if (is_valid_request !== true) return false;
|
buyOrders_data.supernodePubKey)) {
|
||||||
|
let isDataSignedBySuperNode = RM_WALLET
|
||||||
if (typeof localbitcoinplusplus.master_configurations.supernodesPubKeys == "object" &&
|
.verify(buyOrders_data.data_hash, buyOrders_data.supernode_sign,
|
||||||
localbitcoinplusplus.master_configurations.supernodesPubKeys.includes(
|
buyOrders_data.supernodePubKey);
|
||||||
buyOrders_data.supernodePubKey)) {
|
if (isDataSignedBySuperNode === true) {
|
||||||
let isDataSignedBySuperNode = RM_WALLET
|
// Add buy order
|
||||||
.verify(buyOrders_data.data_hash, buyOrders_data.supernode_sign,
|
addDB("buyOrders", buyOrders_data).then(() => {
|
||||||
buyOrders_data.supernodePubKey);
|
showMessage(`Your buy order is placed successfully.`);
|
||||||
if (isDataSignedBySuperNode === true) {
|
});
|
||||||
// Add buy order
|
|
||||||
addDB("buyOrders", buyOrders_data).then(() => {
|
|
||||||
showMessage(`Your buy order is placed successfully.`);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
});
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case "trade_sell":
|
case "trade_sell":
|
||||||
@ -16974,24 +16945,20 @@
|
|||||||
// Only the relevent user node should get response
|
// Only the relevent user node should get response
|
||||||
if(res_obj.params[0].trader_flo_address !== localbitcoinplusplus.wallets.my_local_flo_address) return;
|
if(res_obj.params[0].trader_flo_address !== localbitcoinplusplus.wallets.my_local_flo_address) return;
|
||||||
|
|
||||||
RM_RPC.filter_legit_requests(params.trader_flo_address,
|
if (typeof localbitcoinplusplus.master_configurations.supernodesPubKeys == "object" &&
|
||||||
function (is_valid_request) {
|
localbitcoinplusplus.master_configurations.supernodesPubKeys.includes(
|
||||||
if (is_valid_request !== true) return false;
|
sellOrders_data
|
||||||
if (typeof localbitcoinplusplus.master_configurations.supernodesPubKeys == "object" &&
|
.supernodePubKey)) {
|
||||||
localbitcoinplusplus.master_configurations.supernodesPubKeys.includes(
|
let isDataSignedBySuperNode = RM_WALLET
|
||||||
sellOrders_data
|
.verify(sellOrders_data.data_hash, sellOrders_data.supernode_sign,
|
||||||
.supernodePubKey)) {
|
sellOrders_data.supernodePubKey);
|
||||||
let isDataSignedBySuperNode = RM_WALLET
|
if (isDataSignedBySuperNode === true) {
|
||||||
.verify(sellOrders_data.data_hash, sellOrders_data.supernode_sign,
|
// Add buy order
|
||||||
sellOrders_data.supernodePubKey);
|
addDB("sellOrders", sellOrders_data).then(() => {
|
||||||
if (isDataSignedBySuperNode === true) {
|
showMessage(`Your sell order is placed successfully.`);
|
||||||
// Add buy order
|
});;
|
||||||
addDB("sellOrders", sellOrders_data).then(() => {
|
|
||||||
showMessage(`Your sell order is placed successfully.`);
|
|
||||||
});;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
});
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case "sync_with_supernode":
|
case "sync_with_supernode":
|
||||||
@ -17617,7 +17584,7 @@
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case "refresh_deposit_status_request":
|
case "refresh_deposit_status_request":
|
||||||
RM_RPC.filter_legit_requests((is_valid_request) => {
|
RM_RPC.filter_legit_backup_requests((is_valid_request) => {
|
||||||
if (is_valid_request !== true) return false;
|
if (is_valid_request !== true) return false;
|
||||||
|
|
||||||
if(typeof res_obj.params[0].trader_flo_address !="string") return;
|
if(typeof res_obj.params[0].trader_flo_address !="string") return;
|
||||||
@ -17637,7 +17604,7 @@
|
|||||||
res.map(function (deposit_trade) {
|
res.map(function (deposit_trade) {
|
||||||
if (localbitcoinplusplus.master_configurations.tradableAsset1
|
if (localbitcoinplusplus.master_configurations.tradableAsset1
|
||||||
.includes(deposit_trade.product)) {
|
.includes(deposit_trade.product)) {
|
||||||
validateDepositedBTCBalance(deposit_trade);
|
validateDepositedBTCBalance(deposit_trade, res_obj.params[0].trader_flo_address);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@ -17735,7 +17702,7 @@
|
|||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
let SuPubKey = backup_server_db_instance.backup_readDB(userPublicData, updateUserCryptoBalanceResponseObject.trader_flo_address)
|
let SuPubKey = backup_server_db_instance.backup_readDB('userPublicData', updateUserCryptoBalanceResponseObject.trader_flo_address)
|
||||||
.then(user_data => {
|
.then(user_data => {
|
||||||
if (typeof user_data !== "object" || user_data.supernode_flo_public_key.length <
|
if (typeof user_data !== "object" || user_data.supernode_flo_public_key.length <
|
||||||
1)
|
1)
|
||||||
@ -19547,7 +19514,11 @@
|
|||||||
asset_button_box.appendChild(refresh_crypto_status_btn);
|
asset_button_box.appendChild(refresh_crypto_status_btn);
|
||||||
refresh_crypto_status_btn.addEventListener('click', function () {
|
refresh_crypto_status_btn.addEventListener('click', function () {
|
||||||
let refresh_deposit_status = RM_RPC.send_rpc.call(this,
|
let refresh_deposit_status = RM_RPC.send_rpc.call(this,
|
||||||
"refresh_deposit_status_request", {receiver_flo_address: localbitcoinplusplus.MY_SUPERNODE_FLO_ADDRESS});
|
"refresh_deposit_status_request",
|
||||||
|
{
|
||||||
|
receiver_flo_address: localbitcoinplusplus.MY_SUPERNODE_FLO_ADDRESS,
|
||||||
|
trader_flo_address: localbitcoinplusplus.wallets.my_local_flo_address
|
||||||
|
});
|
||||||
doSend(refresh_deposit_status);
|
doSend(refresh_deposit_status);
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -19702,13 +19673,30 @@
|
|||||||
|
|
||||||
<script>
|
<script>
|
||||||
//Function to check current balance of a BTC address
|
//Function to check current balance of a BTC address
|
||||||
function validateDepositedBTCBalance(trader_deposits) {
|
function validateDepositedBTCBalance(trader_deposits, backup_db="") {
|
||||||
if (!localbitcoinplusplus.master_configurations.supernodesPubKeys
|
if (!localbitcoinplusplus.master_configurations.supernodesPubKeys
|
||||||
.includes(localbitcoinplusplus.wallets.my_local_flo_public_key) &&
|
.includes(localbitcoinplusplus.wallets.my_local_flo_public_key) &&
|
||||||
typeof localbitcoinplusplus.wallets.MY_SUPERNODE_PRIVATE_KEY !== "string"
|
typeof localbitcoinplusplus.wallets.MY_SUPERNODE_PRIVATE_KEY !== "string"
|
||||||
) return false;
|
) return false;
|
||||||
if (!localbitcoinplusplus.master_configurations.tradableAsset1
|
if (!localbitcoinplusplus.master_configurations.tradableAsset1
|
||||||
.includes(trader_deposits.product)) return false;
|
.includes(trader_deposits.product)) return false;
|
||||||
|
|
||||||
|
if (typeof backup_db=="string" && backup_db.length>0) {
|
||||||
|
if (typeof localbitcoinplusplus.newBackupDatabase.db[backup_db] == "object") {
|
||||||
|
readDB = localbitcoinplusplus.newBackupDatabase.db[backup_db].backup_readDB;
|
||||||
|
readDBbyIndex = localbitcoinplusplus.newBackupDatabase.db[backup_db].backup_readDBbyIndex;
|
||||||
|
readAllDB = localbitcoinplusplus.newBackupDatabase.db[backup_db].backup_readAllDB;
|
||||||
|
updateinDB = localbitcoinplusplus.newBackupDatabase.db[backup_db].backup_updateinDB;
|
||||||
|
removeinDB = localbitcoinplusplus.newBackupDatabase.db[backup_db].backup_removeinDB;
|
||||||
|
removeByIndex = localbitcoinplusplus.newBackupDatabase.db[backup_db].backup_removeByIndex;
|
||||||
|
removeAllinDB = localbitcoinplusplus.newBackupDatabase.db[backup_db].backup_removeAllinDB;
|
||||||
|
} else {
|
||||||
|
err_msg = `WARNING: Invalid Backup DB Instance Id: ${backup_db}.`;
|
||||||
|
showMessage(err_msg);
|
||||||
|
throw new Error(err_msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
let explorer;
|
let explorer;
|
||||||
switch (trader_deposits.product) {
|
switch (trader_deposits.product) {
|
||||||
case "BTC":
|
case "BTC":
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user