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>, }
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}