keri_controller/identifier/mechanics/
delegate.rs1use 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 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}