macro_rules! decl_event {
    (
		$(#[$attr:meta])*
		pub enum Event<$evt_generic_param:ident $(, $instance:ident $(: $instantiable:ident)? $( = $event_default_instance:path)? )?> where
			$( $tt:tt )*
	) => { ... };
    (
		$(#[$attr:meta])*
		pub enum Event {
			$(
				$events:tt
			)*
		}
	) => { ... };
}
Expand description

Implement the Event for a module.

Simple Event Example:

frame_support::decl_event!(
   pub enum Event {
      Success,
      Failure(String),
   }
);

Generic Event Example:

trait Config {
    type Balance;
    type Token;
}

mod event1 {
    // Event that specifies the generic parameter explicitly (`Balance`).
    frame_support::decl_event!(
       pub enum Event<T> where Balance = <T as super::Config>::Balance {
          Message(Balance),
       }
    );
}

mod event2 {
    // Event that uses the generic parameter `Balance`.
    // If no name for the generic parameter is specified explicitly,
    // the name will be taken from the type name of the trait.
    frame_support::decl_event!(
       pub enum Event<T> where <T as super::Config>::Balance {
          Message(Balance),
       }
    );
}

mod event3 {
    // And we even support declaring multiple generic parameters!
    frame_support::decl_event!(
       pub enum Event<T> where <T as super::Config>::Balance, <T as super::Config>::Token {
          Message(Balance, Token),
       }
    );
}

The syntax for generic events requires the where.

Generic Event with Instance Example:

trait Config<I: Instance=DefaultInstance> {
    type Balance;
    type Token;
}

// For module with instances, DefaultInstance is optional
frame_support::decl_event!(
   pub enum Event<T, I: Instance = DefaultInstance> where
      <T as Config>::Balance,
      <T as Config>::Token
   {
      Message(Balance, Token),
   }
);