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}