aimo_core/
receipt.rs

1use serde::{Deserialize, Serialize};
2use sha2::{Digest, Sha256};
3use solana_sdk::pubkey::Pubkey;
4
5#[derive(Debug, Clone, Serialize, Deserialize)]
6pub struct RequestReceipt {
7    pub sender: Pubkey,
8    pub request_id: Pubkey,
9    pub service_id: Pubkey,
10    pub max_est_cost: u64,
11    pub timestamp: i64,
12    pub finish_reason: u8,
13    pub prompt_tokens: u64,
14    pub completion_tokens: u64,
15    pub amount: u64,
16    pub token_mint: Pubkey,
17    pub model_name: Option<String>, // Added model name for better statistics tracking
18}
19
20impl RequestReceipt {
21    pub fn into_bytes(self) -> Vec<u8> {
22        let model_name_bytes = self.model_name.unwrap_or_default().into_bytes();
23        vec![
24            self.sender.to_bytes().to_vec(),
25            self.request_id.to_bytes().to_vec(),
26            self.service_id.to_bytes().to_vec(),
27            self.max_est_cost.to_be_bytes().to_vec(),
28            self.timestamp.to_be_bytes().to_vec(),
29            self.finish_reason.to_be_bytes().to_vec(),
30            self.prompt_tokens.to_be_bytes().to_vec(),
31            self.completion_tokens.to_be_bytes().to_vec(),
32            self.amount.to_be_bytes().to_vec(),
33            self.token_mint.to_bytes().to_vec(),
34            model_name_bytes,
35        ]
36        .concat()
37    }
38
39    pub fn into_hash(self) -> [u8; 32] {
40        let mut hasher = Sha256::new();
41        hasher.update(self.into_bytes());
42        hasher.finalize().into()
43    }
44}