massa_versioning/
address_factory.rs1use crate::{
2 versioning::{MipComponent, MipStore},
3 versioning_factory::{FactoryError, FactoryStrategy, VersioningFactory},
4};
5use massa_hash::Hash;
6use massa_models::address::{Address, SCAddress, SCAddressV0, UserAddress, UserAddressV0};
7
8#[derive(Clone)]
9pub struct AddressFactory {
10 pub mip_store: MipStore,
11}
12
13pub enum AddressArgs {
14 User { hash: Hash },
15 SC { hash: Hash },
16}
17
18impl VersioningFactory for AddressFactory {
19 type Output = Address;
20 type Error = FactoryError;
21 type Arguments = AddressArgs;
22
23 fn get_component() -> MipComponent {
24 MipComponent::Address
25 }
26
27 fn get_versioning_store(&self) -> MipStore {
28 self.mip_store.clone()
29 }
30
31 fn create(
32 &self,
33 args: &Self::Arguments,
34 strategy: FactoryStrategy,
35 ) -> Result<Self::Output, Self::Error> {
36 let version = self.get_component_version_with_strategy(strategy)?;
37
38 let output: Address = match version {
39 0 => match args {
40 AddressArgs::User { hash } => {
41 Address::User(UserAddress::UserAddressV0(UserAddressV0(*hash)))
42 }
43 AddressArgs::SC { hash } => Address::SC(SCAddress::SCAddressV0(SCAddressV0(*hash))),
44 },
45 v => return Err(FactoryError::UnimplementedVersion(v)),
46 };
47
48 Ok(output)
49 }
50}