use serde::{Deserialize, Serialize};
use std::time::SystemTime;
use xor_name::XorName;
use crate::{MainPubkey, NanoTokens, Transfer};
#[derive(Clone, Serialize, Deserialize, Eq, PartialEq, custom_debug::Debug)]
pub struct Payment {
#[debug(skip)]
pub transfers: Vec<Transfer>,
pub quote: PaymentQuote,
}
#[derive(Clone, Serialize, Deserialize)]
pub struct PaymentDetails {
pub recipient: MainPubkey,
pub peer_id_bytes: Vec<u8>,
pub transfer: (Transfer, NanoTokens),
pub royalties: (Transfer, NanoTokens),
pub quote: PaymentQuote,
}
impl PaymentDetails {
pub fn to_payment(&self) -> Payment {
Payment {
transfers: vec![self.transfer.0.clone(), self.royalties.0.clone()],
quote: self.quote.clone(),
}
}
}
pub type QuoteSignature = Vec<u8>;
#[derive(
Clone, Eq, PartialEq, PartialOrd, Ord, Hash, Serialize, Deserialize, custom_debug::Debug,
)]
pub struct PaymentQuote {
pub content: XorName,
pub cost: NanoTokens,
pub timestamp: SystemTime,
#[debug(skip)]
pub signature: QuoteSignature,
}
impl PaymentQuote {
pub fn zero() -> Self {
Self {
content: Default::default(),
cost: NanoTokens::zero(),
timestamp: SystemTime::now(),
signature: vec![],
}
}
pub fn bytes_for_signing(xorname: XorName, cost: NanoTokens, timestamp: SystemTime) -> Vec<u8> {
let mut bytes = xorname.to_vec();
bytes.extend_from_slice(&cost.to_bytes());
bytes.extend_from_slice(
×tamp
.duration_since(SystemTime::UNIX_EPOCH)
.expect("Unix epoch to be in the past")
.as_secs()
.to_le_bytes(),
);
bytes
}
pub fn test_dummy(xorname: XorName, cost: NanoTokens) -> Self {
Self {
content: xorname,
cost,
timestamp: SystemTime::now(),
signature: vec![],
}
}
}