teliox 0.17.13

Library for the Transaction Event Log
Documentation
use keri_core::{event::sections::seal::EventSeal, prefix::IdentifierPrefix};
use said::version::format::SerializationFormats;
use said::{derivation::HashFunction, derivation::HashFunctionCode, SelfAddressingIdentifier};

use crate::{
    error::Error,
    event::{
        manager_event::{Config, Inc, ManagerEventType, ManagerTelEvent, Rot},
        vc_event::{Issuance, Revocation, SimpleIssuance, SimpleRevocation, VCEvent, VCEventType},
        Event,
    },
    state::ManagerTelState,
};

pub fn make_inception_event(
    issuer_prefix: IdentifierPrefix,
    config: Vec<Config>,
    backer_threshold: u64,
    backers: Vec<IdentifierPrefix>,
    derivation: Option<&HashFunctionCode>,
    serialization_format: Option<&SerializationFormats>,
) -> Result<Event, Error> {
    let event_type = Inc {
        issuer_id: issuer_prefix,
        config,
        backer_threshold,
        backers,
    };

    Ok(Event::Management(
        event_type
            .incept_self_addressing(
                &HashFunction::from(
                    derivation
                        .unwrap_or(&HashFunctionCode::Blake3_256)
                        .to_owned(),
                ),
                serialization_format
                    .unwrap_or(&SerializationFormats::JSON)
                    .to_owned(),
            )?
            .to_message(
                *serialization_format.unwrap_or(&SerializationFormats::JSON),
                derivation.unwrap_or(&HashFunctionCode::Blake3_256).clone(),
            )?,
    ))
}

pub fn make_rotation_event(
    state: &ManagerTelState,
    ba: &[IdentifierPrefix],
    br: &[IdentifierPrefix],
    derivation: Option<&HashFunctionCode>,
    serialization_format: Option<&SerializationFormats>,
) -> Result<Event, Error> {
    let rot_data = Rot {
        prev_event: state.last.clone(),
        backers_to_add: ba.to_vec(),
        backers_to_remove: br.to_vec(),
    };
    Ok(Event::Management(
        ManagerTelEvent::new(&state.prefix, state.sn + 1, ManagerEventType::Vrt(rot_data))
            .to_message(
                serialization_format
                    .unwrap_or(&SerializationFormats::JSON)
                    .to_owned(),
                derivation.unwrap_or(&HashFunctionCode::Blake3_256).clone(),
            )?,
    ))
}

pub fn make_simple_issuance_event(
    registry_id: IdentifierPrefix,
    vc_hash: SelfAddressingIdentifier,
    derivation: Option<&HashFunctionCode>,
    serialization_format: Option<&SerializationFormats>,
) -> Result<Event, Error> {
    let iss = VCEventType::Iss(SimpleIssuance { registry_id });
    let vc_prefix = IdentifierPrefix::self_addressing(vc_hash);
    Ok(Event::Vc(VCEvent::new(vc_prefix, 0, iss).to_message(
        *serialization_format.unwrap_or(&SerializationFormats::JSON),
        derivation.unwrap_or(&HashFunctionCode::Blake3_256).clone(),
    )?))
}

pub fn make_issuance_event(
    state: &ManagerTelState,
    vc_hash: SelfAddressingIdentifier,
    derivation: Option<&HashFunctionCode>,
    serialization_format: Option<&SerializationFormats>,
) -> Result<Event, Error> {
    let registry_anchor = EventSeal::new(state.prefix.clone(), state.sn, state.last.clone());
    let iss = VCEventType::Bis(Issuance::new(state.issuer.clone(), registry_anchor));
    let vc_prefix = IdentifierPrefix::self_addressing(vc_hash);
    Ok(Event::Vc(VCEvent::new(vc_prefix, 0, iss).to_message(
        *serialization_format.unwrap_or(&SerializationFormats::JSON),
        derivation.unwrap_or(&HashFunctionCode::Blake3_256).clone(),
    )?))
}

pub fn make_simple_revoke_event(
    vc_hash: &SelfAddressingIdentifier,
    last_vc_event_hash: SelfAddressingIdentifier,
    state: &ManagerTelState,
    derivation: Option<&HashFunctionCode>,
    serialization_format: Option<&SerializationFormats>,
) -> Result<Event, Error> {
    let rev = VCEventType::Rev(SimpleRevocation {
        registry_id: state.prefix.clone(),
        prev_event_hash: last_vc_event_hash,
    });
    let vc_prefix = IdentifierPrefix::self_addressing(vc_hash.to_owned());

    Ok(Event::Vc(
        VCEvent::new(vc_prefix, state.sn + 1, rev).to_message(
            *serialization_format.unwrap_or(&SerializationFormats::JSON),
            derivation.unwrap_or(&HashFunctionCode::Blake3_256).clone(),
        )?,
    ))
}

pub fn make_revoke_event(
    vc_hash: &SelfAddressingIdentifier,
    last_vc_event_hash: SelfAddressingIdentifier,
    state: &ManagerTelState,
    derivation: Option<&HashFunctionCode>,
    serialization_format: Option<&SerializationFormats>,
) -> Result<Event, Error> {
    let registry_anchor = EventSeal::new(state.prefix.to_owned(), state.sn, state.last.clone());
    let rev = VCEventType::Brv(Revocation {
        prev_event_hash: last_vc_event_hash,
        registry_anchor: Some(registry_anchor),
    });
    let vc_prefix = IdentifierPrefix::self_addressing(vc_hash.to_owned());

    Ok(Event::Vc(
        VCEvent::new(vc_prefix, state.sn + 1, rev).to_message(
            *serialization_format.unwrap_or(&SerializationFormats::JSON),
            derivation.unwrap_or(&HashFunctionCode::Blake3_256).clone(),
        )?,
    ))
}