diff --git a/accounts/src/account_core/mod.rs b/accounts/src/account_core/mod.rs index 1adcecc..192c158 100644 --- a/accounts/src/account_core/mod.rs +++ b/accounts/src/account_core/mod.rs @@ -16,7 +16,7 @@ use crate::key_management::{ pub type PublicKey = AffinePoint; pub type AccountAddress = TreeHashType; -#[derive(Serialize, Deserialize, Clone)] +#[derive(Clone)] pub struct Account { pub key_holder: AddressKeyHolder, pub address: AccountAddress, @@ -24,6 +24,64 @@ pub struct Account { pub utxos: HashMap, } +#[derive(Serialize, Deserialize, Clone)] +pub struct AccountForSerialization { + pub key_holder: AddressKeyHolder, + pub address: AccountAddress, + pub balance: u64, + pub utxos: HashMap, +} + +impl From for AccountForSerialization { + fn from(value: Account) -> Self { + AccountForSerialization { + key_holder: value.key_holder, + address: value.address, + balance: value.balance, + utxos: value + .utxos + .into_iter() + .map(|(key, val)| (hex::encode(key), val)) + .collect(), + } + } +} + +impl From for Account { + fn from(value: AccountForSerialization) -> Self { + Account { + key_holder: value.key_holder, + address: value.address, + balance: value.balance, + utxos: value + .utxos + .into_iter() + .map(|(key, val)| (hex::decode(key).unwrap().try_into().unwrap(), val)) + .collect(), + } + } +} + +impl Serialize for Account { + fn serialize(&self, serializer: S) -> Result + where + S: serde::Serializer, + { + let account_for_serialization: AccountForSerialization = From::from(self.clone()); + account_for_serialization.serialize(serializer) + } +} + +impl<'de> Deserialize<'de> for Account { + fn deserialize(deserializer: D) -> Result + where + D: serde::Deserializer<'de>, + { + let account_for_serialization = ::deserialize(deserializer)?; + Ok(account_for_serialization.into()) + } +} + ///A strucure, which represents all the visible(public) information /// /// known to each node about account `address`