Skip to main content

keri_controller/identifier/mechanics/
delegate.rs

1use keri_core::actor::prelude::HashFunctionCode;
2use keri_core::{
3    actor::prelude::SerializationFormats,
4    event::{
5        sections::seal::{EventSeal, Seal},
6        KeyEvent,
7    },
8    event_message::msg::KeriEvent,
9    mailbox::exchange::{Exchange, ExchangeMessage, ForwardTopic, FwdArgs},
10};
11
12use crate::identifier::Identifier;
13
14use super::MechanicsError;
15
16impl Identifier {
17    /// Generates delegating event (ixn) and exchange event that contains
18    /// delegated event which will be send to delegate after ixn finalization.
19    pub fn delegate(
20        &self,
21        delegated_event: &KeriEvent<KeyEvent>,
22    ) -> Result<(KeriEvent<KeyEvent>, ExchangeMessage), MechanicsError> {
23        let delegate = delegated_event.data.get_prefix();
24        let delegated_seal = {
25            let event_digest = delegated_event.digest()?;
26            let sn = delegated_event.data.get_sn();
27            Seal::Event(EventSeal::new(delegate.clone(), sn, event_digest))
28        };
29        let delegating_event = self
30            .known_events
31            .anchor_with_seal(&self.id, &[delegated_seal])?;
32        let exn_message = Exchange::Fwd {
33            args: FwdArgs {
34                recipient_id: delegate,
35                topic: ForwardTopic::Delegate,
36            },
37            to_forward: delegating_event.clone(),
38        }
39        .to_message(SerializationFormats::JSON, HashFunctionCode::Blake3_256);
40        Ok((delegating_event, exn_message))
41    }
42}