evmlib/contract/payment_vault/
mod.rs1use 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
14pub 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
24pub 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 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}