massa_versioning/
address_factory.rs

1use 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}