use serde::{Deserialize, Serialize};
use serde_with::skip_serializing_none;
use starknet_types_core::{felt::Felt, hash::StarkHash};
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Eq, Hash)]
#[skip_serializing_none]
pub struct GetProofOutput {
pub state_commitment: Option<Felt>,
pub class_commitment: Option<Felt>,
pub contract_proof: Vec<TrieNode>,
pub contract_data: Option<ContractData>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Eq, Hash)]
pub enum TrieNode {
#[serde(rename = "binary")]
Binary { left: Felt, right: Felt },
#[serde(rename = "edge")]
Edge { child: Felt, path: Path },
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Eq, Hash)]
pub struct Path {
len: u64,
value: String,
}
impl TrieNode {
pub fn hash<H: StarkHash>(&self) -> Felt {
match self {
TrieNode::Binary { left, right } => H::hash(left, right),
TrieNode::Edge { child, path } => {
let bytes: [u8; 32] = path.value.as_bytes().try_into().unwrap();
let mut length = [0; 32];
length[31] = bytes.len() as u8;
let length = Felt::from_bytes_be(&length);
let path = Felt::from_bytes_be(&bytes);
H::hash(child, &path) + length
}
}
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Eq, Hash)]
pub struct ContractData {
class_hash: Felt,
nonce: Felt,
root: Felt,
contract_state_hash_version: Felt,
pub storage_proofs: Vec<Vec<TrieNode>>,
}