Implement payment forwarding
This commit is contained in:
parent
6b60e9a0da
commit
4e73bff32e
2 changed files with 63 additions and 7 deletions
|
@ -15,7 +15,7 @@ use crate::models::{
|
||||||
profiles::types::PaymentOption,
|
profiles::types::PaymentOption,
|
||||||
users::queries::get_user_by_id,
|
users::queries::get_user_by_id,
|
||||||
};
|
};
|
||||||
use super::wallet::{DEFAULT_ACCOUNT, MoneroError};
|
use super::wallet::{send_monero, DEFAULT_ACCOUNT, MoneroError};
|
||||||
|
|
||||||
pub async fn check_monero_subscriptions(
|
pub async fn check_monero_subscriptions(
|
||||||
config: &MoneroConfig,
|
config: &MoneroConfig,
|
||||||
|
@ -119,11 +119,17 @@ pub async fn check_monero_subscriptions(
|
||||||
continue;
|
continue;
|
||||||
};
|
};
|
||||||
let payout_address = Address::from_str(&payment_info.payout_address)?;
|
let payout_address = Address::from_str(&payment_info.payout_address)?;
|
||||||
log::info!(
|
let _payout_amount = send_monero(
|
||||||
"invoice {}, payout address {}",
|
&wallet_client,
|
||||||
invoice.id,
|
address_index.minor,
|
||||||
payout_address,
|
payout_address,
|
||||||
);
|
).await?;
|
||||||
|
set_invoice_status(
|
||||||
|
db_client,
|
||||||
|
&invoice.id,
|
||||||
|
InvoiceStatus::Forwarded,
|
||||||
|
).await?;
|
||||||
|
log::info!("processed payment for invoice {}", invoice.id);
|
||||||
};
|
};
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,14 @@
|
||||||
use monero_rpc::RpcClient;
|
use monero_rpc::{
|
||||||
use monero_rpc::monero::{Address, util::address::Error as AddressError};
|
RpcClient,
|
||||||
|
SweepAllArgs,
|
||||||
|
TransferPriority,
|
||||||
|
WalletClient,
|
||||||
|
};
|
||||||
|
use monero_rpc::monero::{
|
||||||
|
Address,
|
||||||
|
Amount,
|
||||||
|
util::address::Error as AddressError,
|
||||||
|
};
|
||||||
|
|
||||||
use crate::config::MoneroConfig;
|
use crate::config::MoneroConfig;
|
||||||
use crate::errors::DatabaseError;
|
use crate::errors::DatabaseError;
|
||||||
|
@ -46,3 +55,44 @@ pub async fn create_monero_address(
|
||||||
log::info!("created monero address {}/{}", DEFAULT_ACCOUNT, address_index);
|
log::info!("created monero address {}/{}", DEFAULT_ACCOUNT, address_index);
|
||||||
Ok(address)
|
Ok(address)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn get_single_item<T: Clone>(items: Vec<T>) -> Result<T, MoneroError> {
|
||||||
|
if let [item] = &items[..] {
|
||||||
|
Ok(item.clone())
|
||||||
|
} else {
|
||||||
|
Err(MoneroError::OtherError("invalid response from wallet"))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// http://monerotoruzizulg5ttgat2emf4d6fbmiea25detrmmy7erypseyteyd.onion/resources/developer-guides/wallet-rpc.html#sweep_all
|
||||||
|
pub async fn send_monero(
|
||||||
|
wallet_client: &WalletClient,
|
||||||
|
from_address: u32,
|
||||||
|
to_address: Address,
|
||||||
|
) -> Result<Amount, MoneroError> {
|
||||||
|
let sweep_args = SweepAllArgs {
|
||||||
|
address: to_address,
|
||||||
|
account_index: DEFAULT_ACCOUNT,
|
||||||
|
subaddr_indices: Some(vec![from_address]),
|
||||||
|
priority: TransferPriority::Default,
|
||||||
|
mixin: 15,
|
||||||
|
ring_size: 16,
|
||||||
|
unlock_time: 1,
|
||||||
|
get_tx_keys: None,
|
||||||
|
below_amount: None,
|
||||||
|
do_not_relay: None,
|
||||||
|
get_tx_hex: None,
|
||||||
|
get_tx_metadata: None,
|
||||||
|
};
|
||||||
|
let sweep_data = wallet_client.sweep_all(sweep_args).await?;
|
||||||
|
let tx_hash = get_single_item(sweep_data.tx_hash_list)?;
|
||||||
|
let amount = get_single_item(sweep_data.amount_list)?;
|
||||||
|
let fee = get_single_item(sweep_data.fee_list)?;
|
||||||
|
log::info!(
|
||||||
|
"sent transaction {}, amount {}, fee {}",
|
||||||
|
tx_hash,
|
||||||
|
amount,
|
||||||
|
fee,
|
||||||
|
);
|
||||||
|
Ok(amount)
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue