ecash_core/
token.rs

1use chrono::{DateTime, Utc};
2use serde::{Deserialize, Serialize};
3
4#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
5pub struct Token {
6    pub serial_number: Vec<u8>,
7    pub denomination: u64,
8    pub currency: String,
9    pub signature: Vec<u8>,
10    pub issued_at: DateTime<Utc>,
11    pub expires_at: DateTime<Utc>,
12    pub institution_id: String,
13    pub key_id: String,
14}
15
16impl Token {
17    pub fn new(
18        serial_number: Vec<u8>,
19        denomination: u64,
20        currency: String,
21        signature: Vec<u8>,
22        expires_at: DateTime<Utc>,
23        institution_id: String,
24        key_id: String,
25    ) -> Self {
26        Self {
27            serial_number,
28            denomination,
29            currency,
30            signature,
31            issued_at: Utc::now(),
32            expires_at,
33            institution_id,
34            key_id,
35        }
36    }
37
38    pub fn is_expired(&self) -> bool {
39        Utc::now() > self.expires_at
40    }
41
42    pub fn serial_hex(&self) -> String {
43        hex::encode(&self.serial_number)
44    }
45}
46
47#[derive(Debug, Clone, Serialize, Deserialize)]
48pub struct BlindedToken {
49    pub blinded_message: Vec<u8>,
50    pub denomination: u64,
51    pub currency: String,
52}
53
54#[derive(Debug, Clone, Serialize, Deserialize)]
55pub struct BlindSignature {
56    pub signature: Vec<u8>,
57    pub key_id: String,
58}
59
60#[derive(Debug, Clone)]
61pub struct TokenMetadata {
62    pub serial_number: Vec<u8>,
63    pub blinding_factor: Vec<u8>,
64    pub denomination: u64,
65    pub currency: String,
66}