Don't forward payment until all outputs are unlocked
This commit is contained in:
parent
0c7f23bc76
commit
5122fe2b78
2 changed files with 28 additions and 12 deletions
|
@ -25,7 +25,12 @@ use crate::models::{
|
||||||
},
|
},
|
||||||
users::queries::get_user_by_id,
|
users::queries::get_user_by_id,
|
||||||
};
|
};
|
||||||
use super::wallet::{send_monero, DEFAULT_ACCOUNT, MoneroError};
|
use super::wallet::{
|
||||||
|
get_subaddress_balance,
|
||||||
|
send_monero,
|
||||||
|
DEFAULT_ACCOUNT,
|
||||||
|
MoneroError,
|
||||||
|
};
|
||||||
|
|
||||||
const INVOICE_TIMEOUT: i64 = 30 * 60; // 30 minutes
|
const INVOICE_TIMEOUT: i64 = 30 * 60; // 30 minutes
|
||||||
|
|
||||||
|
@ -108,17 +113,14 @@ pub async fn check_monero_subscriptions(
|
||||||
for invoice in paid_invoices {
|
for invoice in paid_invoices {
|
||||||
let address = Address::from_str(&invoice.payment_address)?;
|
let address = Address::from_str(&invoice.payment_address)?;
|
||||||
let address_index = wallet_client.get_address_index(address).await?;
|
let address_index = wallet_client.get_address_index(address).await?;
|
||||||
let balance_data = wallet_client.get_balance(
|
let balance_data = get_subaddress_balance(
|
||||||
address_index.major,
|
&wallet_client,
|
||||||
Some(vec![address_index.minor]),
|
&address_index,
|
||||||
).await?;
|
).await?;
|
||||||
let unlocked_balance = if let [subaddress_data] = &balance_data.per_subaddress[..] {
|
if balance_data.balance != balance_data.unlocked_balance ||
|
||||||
subaddress_data.unlocked_balance
|
balance_data.balance == Amount::ZERO
|
||||||
} else {
|
{
|
||||||
return Err(MoneroError::OtherError("invalid response from wallet"));
|
// Don't forward payment until all outputs are unlocked
|
||||||
};
|
|
||||||
if unlocked_balance == Amount::ZERO {
|
|
||||||
// Not ready for forwarding
|
|
||||||
continue;
|
continue;
|
||||||
};
|
};
|
||||||
let sender = get_profile_by_id(db_client, &invoice.sender_id).await?;
|
let sender = get_profile_by_id(db_client, &invoice.sender_id).await?;
|
||||||
|
|
|
@ -1,13 +1,15 @@
|
||||||
use monero_rpc::{
|
use monero_rpc::{
|
||||||
RpcClient,
|
RpcClient,
|
||||||
|
SubaddressBalanceData,
|
||||||
SweepAllArgs,
|
SweepAllArgs,
|
||||||
TransferPriority,
|
TransferPriority,
|
||||||
WalletClient,
|
WalletClient,
|
||||||
};
|
};
|
||||||
use monero_rpc::monero::{
|
use monero_rpc::monero::{
|
||||||
|
cryptonote::subaddress::Index,
|
||||||
|
util::address::Error as AddressError,
|
||||||
Address,
|
Address,
|
||||||
Amount,
|
Amount,
|
||||||
util::address::Error as AddressError,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
use crate::config::MoneroConfig;
|
use crate::config::MoneroConfig;
|
||||||
|
@ -64,6 +66,18 @@ fn get_single_item<T: Clone>(items: Vec<T>) -> Result<T, MoneroError> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub async fn get_subaddress_balance(
|
||||||
|
wallet_client: &WalletClient,
|
||||||
|
subaddress_index: &Index,
|
||||||
|
) -> Result<SubaddressBalanceData, MoneroError> {
|
||||||
|
let balance_data = wallet_client.get_balance(
|
||||||
|
subaddress_index.major,
|
||||||
|
Some(vec![subaddress_index.minor]),
|
||||||
|
).await?;
|
||||||
|
let subaddress_data = get_single_item(balance_data.per_subaddress)?;
|
||||||
|
Ok(subaddress_data)
|
||||||
|
}
|
||||||
|
|
||||||
/// http://monerotoruzizulg5ttgat2emf4d6fbmiea25detrmmy7erypseyteyd.onion/resources/developer-guides/wallet-rpc.html#sweep_all
|
/// http://monerotoruzizulg5ttgat2emf4d6fbmiea25detrmmy7erypseyteyd.onion/resources/developer-guides/wallet-rpc.html#sweep_all
|
||||||
pub async fn send_monero(
|
pub async fn send_monero(
|
||||||
wallet_client: &WalletClient,
|
wallet_client: &WalletClient,
|
||||||
|
|
Loading…
Reference in a new issue