miden_objects/account/
header.rs1use alloc::vec::Vec;
2
3use super::{Account, AccountId, Digest, Felt, PartialAccount, ZERO, hash_account};
4use crate::utils::serde::{Deserializable, Serializable};
5
6#[derive(Debug, Clone, PartialEq, Eq)]
19pub struct AccountHeader {
20 id: AccountId,
21 nonce: Felt,
22 vault_root: Digest,
23 storage_commitment: Digest,
24 code_commitment: Digest,
25}
26
27impl AccountHeader {
28 pub fn new(
32 id: AccountId,
33 nonce: Felt,
34 vault_root: Digest,
35 storage_commitment: Digest,
36 code_commitment: Digest,
37 ) -> Self {
38 Self {
39 id,
40 nonce,
41 vault_root,
42 storage_commitment,
43 code_commitment,
44 }
45 }
46
47 pub fn commitment(&self) -> Digest {
56 hash_account(
57 self.id,
58 self.nonce,
59 self.vault_root,
60 self.storage_commitment,
61 self.code_commitment,
62 )
63 }
64
65 pub fn id(&self) -> AccountId {
67 self.id
68 }
69
70 pub fn nonce(&self) -> Felt {
72 self.nonce
73 }
74
75 pub fn vault_root(&self) -> Digest {
77 self.vault_root
78 }
79
80 pub fn storage_commitment(&self) -> Digest {
82 self.storage_commitment
83 }
84
85 pub fn code_commitment(&self) -> Digest {
87 self.code_commitment
88 }
89
90 pub fn as_elements(&self) -> Vec<Felt> {
103 [
104 &[self.id.suffix(), self.id.prefix().as_felt(), ZERO, self.nonce],
105 self.vault_root.as_elements(),
106 self.storage_commitment.as_elements(),
107 self.code_commitment.as_elements(),
108 ]
109 .concat()
110 }
111}
112
113impl From<PartialAccount> for AccountHeader {
114 fn from(account: PartialAccount) -> Self {
115 (&account).into()
116 }
117}
118
119impl From<&PartialAccount> for AccountHeader {
120 fn from(account: &PartialAccount) -> Self {
121 Self {
122 id: account.id(),
123 nonce: account.nonce(),
124 vault_root: account.vault().root(),
125 storage_commitment: account.storage().commitment(),
126 code_commitment: account.code().commitment(),
127 }
128 }
129}
130
131impl From<Account> for AccountHeader {
132 fn from(account: Account) -> Self {
133 (&account).into()
134 }
135}
136
137impl From<&Account> for AccountHeader {
138 fn from(account: &Account) -> Self {
139 Self {
140 id: account.id(),
141 nonce: account.nonce(),
142 vault_root: account.vault().root(),
143 storage_commitment: account.storage().commitment(),
144 code_commitment: account.code().commitment(),
145 }
146 }
147}
148
149impl Serializable for AccountHeader {
150 fn write_into<W: vm_core::utils::ByteWriter>(&self, target: &mut W) {
151 self.id.write_into(target);
152 self.nonce.write_into(target);
153 self.vault_root.write_into(target);
154 self.storage_commitment.write_into(target);
155 self.code_commitment.write_into(target);
156 }
157}
158
159impl Deserializable for AccountHeader {
160 fn read_from<R: vm_core::utils::ByteReader>(
161 source: &mut R,
162 ) -> Result<Self, vm_processor::DeserializationError> {
163 let id = AccountId::read_from(source)?;
164 let nonce = Felt::read_from(source)?;
165 let vault_root = Digest::read_from(source)?;
166 let storage_commitment = Digest::read_from(source)?;
167 let code_commitment = Digest::read_from(source)?;
168
169 Ok(AccountHeader {
170 id,
171 nonce,
172 vault_root,
173 storage_commitment,
174 code_commitment,
175 })
176 }
177}
178
179#[cfg(test)]
183mod tests {
184 use vm_core::{
185 Felt,
186 utils::{Deserializable, Serializable},
187 };
188
189 use super::AccountHeader;
190 use crate::{
191 account::{StorageSlot, tests::build_account},
192 asset::FungibleAsset,
193 };
194
195 #[test]
196 fn test_serde_account_storage() {
197 let init_nonce = Felt::new(1);
198 let asset_0 = FungibleAsset::mock(99);
199 let word = [Felt::new(1), Felt::new(2), Felt::new(3), Felt::new(4)];
200 let storage_slot = StorageSlot::Value(word);
201 let account = build_account(vec![asset_0], init_nonce, vec![storage_slot]);
202
203 let account_header: AccountHeader = account.into();
204
205 let header_bytes = account_header.to_bytes();
206 let deserialized_header = AccountHeader::read_from_bytes(&header_bytes).unwrap();
207 assert_eq!(deserialized_header, account_header);
208 }
209}