evmlib/contract/payment_vault/
mod.rs

1use crate::Network;
2use crate::common::{Address, Amount, QuoteHash};
3use crate::contract::payment_vault::handler::PaymentVaultHandler;
4use crate::quoting_metrics::QuotingMetrics;
5use crate::utils::http_provider;
6
7pub mod error;
8pub mod handler;
9pub mod implementation;
10pub mod interface;
11
12pub const MAX_TRANSFERS_PER_TRANSACTION: usize = 256;
13
14/// Helper function to return a quote for the given quoting metrics.
15pub async fn get_market_price(
16    network: &Network,
17    quoting_metrics: Vec<QuotingMetrics>,
18) -> Result<Vec<Amount>, error::Error> {
19    let provider = http_provider(network.rpc_url().clone());
20    let payment_vault = PaymentVaultHandler::new(*network.data_payments_address(), provider);
21    payment_vault.get_quote(quoting_metrics).await
22}
23
24/// Helper function to verify whether a data payment is valid.
25/// Returns the amount paid to the owned quote hashes.
26pub async fn verify_data_payment(
27    network: &Network,
28    owned_quote_hashes: Vec<QuoteHash>,
29    payment: Vec<(QuoteHash, QuotingMetrics, Address)>,
30) -> Result<Amount, error::Error> {
31    let provider = http_provider(network.rpc_url().clone());
32    let payment_vault = PaymentVaultHandler::new(*network.data_payments_address(), provider);
33
34    let mut amount = Amount::ZERO;
35
36    let payment_verifications: Vec<_> = payment
37        .into_iter()
38        .map(interface::IPaymentVault::PaymentVerification::from)
39        .collect();
40
41    let payment_verification_results = payment_vault.verify_payment(payment_verifications).await?;
42
43    for payment_verification_result in payment_verification_results {
44        // TODO we currently fail on a single invalid payment, maybe we should deal with this in a different way
45        if !payment_verification_result.isValid {
46            return Err(error::Error::PaymentInvalid);
47        }
48
49        if owned_quote_hashes.contains(&payment_verification_result.quoteHash) {
50            amount += payment_verification_result.amountPaid;
51        }
52    }
53
54    Ok(amount)
55}