Events

Events are generated for certain operations during execution. The following sections describe events that are part of the default Gear Protocol's runtime.

To subscribe to all events:

const unsub = await api.query.system.events((events) => {
  console.log(events.toHuman());
});
// Unsubscribe
unsub();

Events Types

MessageQueued

Summary: When a user successfully sends a message to a program and it gets added to the message queue.


MessageQueued {
    /// Generated id of the message.
    id: MessageId,
    /// Account id of the source of the message.
    source: T::AccountId,
    /// Program id, who is the message's destination.
    destination: ProgramId,
    /// Entry point for processing of the message.
    /// On the sending stage, the processing function
    /// of the program is always known.
    entry: MessageEntry,
}

UserMessageSent

Summary: When someone has sent a message to the user.

UserMessageSent {
    /// Message sent.
    message: UserMessage,
    /// Block number of expiration from `Mailbox`.
    ///
    /// Equals `Some(_)` with block number when message
    /// will be removed from `Mailbox` due to some
    /// reasons (see #642, #646 and #1010).
    ///
    /// Equals `None` if message wasn't inserted to
    /// `Mailbox` and appears as only `Event`.
    expiration: Option<T::BlockNumber>,
}

UserMessageRead

Summary: When a message has been marked as "read" and it has been removed from the Mailbox. This event only affects messages, which were already prior inserted into the Mailbox.

UserMessageRead {
    /// Id of the message read.
    id: MessageId,
    /// The reason for the reading (removal from `Mailbox`).
    ///
    /// NOTE: See more docs about reasons at `gear_common::event`.
    reason: UserMessageReadReason,
}

MessagesDispatched

Summary: The result of when a message is processed within the block.

MessagesDispatched {
    /// Total amount of messages removed from message queue.
    total: MessengerCapacityOf<T>,
    /// Execution statuses of the messages, which were already known
    /// by `Event::MessageQueued` (sent from user to program).
    statuses: BTreeMap<MessageId, DispatchStatus>,
    /// Ids of programs, which state changed during queue processing.
    state_changes: BTreeSet<ProgramId>,
}

MessageWaited

Summary: When a message's execution has been delayed and it has been added to the waitlist.

MessageWaited {
    /// Id of the message waited.
    id: MessageId,
    /// Origin message id, which started messaging chain with programs,
    /// where currently waited message was created.
    ///
    /// Used to identify by the user that this message associated
    /// with him and the concrete initial message.
    origin: Option<GasNodeId<MessageId, ReservationId>>,
    /// The reason of the waiting (addition to `Waitlist`).
    ///
    /// NOTE: See more docs about reasons at `gear_common::event`.
    reason: MessageWaitedReason,
    /// Block number of expiration from `Waitlist`.
    ///
    /// Equals block number when message will be removed from `Waitlist`
    /// due to some reasons (see #642, #646 and #1010).
    expiration: T::BlockNumber,
}

MessageWoken

Summary: When a message is ready to continue its execution and has been removed from the Waitlist.

MessageWoken {
    /// Id of the message woken.
    id: MessageId,
    /// The reason of the waking (removal from `Waitlist`).
    ///
    /// NOTE: See more docs about reasons at `gear_common::event`.
    reason: MessageWokenReason,
}

CodeChanged

Summary: When a program's code has been altered.

CodeChanged {
    /// Id of the code affected.
    id: CodeId,
    /// Change applied on code with current id.
    ///
    /// NOTE: See more docs about change kinds at `gear_common::event`.
    change: CodeChangeKind<T::BlockNumber>,
}

ProgramChanged

Summary: Any data related to program changed.

ProgramChanged {
    /// Id of the program affected.
    id: ProgramId,
    /// Change applied on program with current id.
    ///
    /// NOTE: See more docs about change kinds at `gear_common::event`.
    change: ProgramChangeKind<T::BlockNumber>,
}

ProgramResumeSessionStarted

Summary: Program resume session has been started.

ProgramResumeSessionStarted {
  /// Id of the session.
  session_id: SessionId,
  /// Owner of the session.
  account_id: T::AccountId,
  /// Id of the program affected.
  program_id: ProgramId,
  /// Block number when the session will be removed if not finished.
  session_end_block: T::BlockNumber
}
        

Check what the event is

api.query.system.events((events) => {
  events
    .filter(({ event }) => api.events.gear.MessageQueued.is(event))
    .forEach(({ event: { data } }) => {
      console.log(data.toHuman());
    });

  events
    .filter(({ event }) => api.events.balances.Transfer.is(event))
    .forEach(({ event: { data } }) => {
      console.log(data.toHuman());
    });
});

Subscribe to specific events

Subscribe to messages sent from a program

const unsub = api.gearEvents.subscribeToGearEvent(
  'UserMessageSent',
  ({
    data: {
      message: { id, source, destination, payload, value, reply },
    },
  }) => {
    console.log(`
  messageId: ${id.toHex()}
  source: ${source.toHex()}
  payload: ${payload.toHuman()}
  `);
  },
);
// Unsubscribe
unsub();

Subscribe to messages intended for a program

const unsub = api.gearEvents.subscribeToGearEvent(
  'MessageQueued',
  ({ data: { id, source, destination, entry } }) => {
    console.log({
      messageId: id.toHex(),
      programId: destination.toHex(),
      userId: source.toHex(),
      entry: entry.isInit
        ? entry.asInit
        : entry.isHandle
        ? entry.asHandle
        : entry.asReply,
    });
  },
);
// Unsubscribe
unsub();

Subscribe to Transfer events

const unsub = await api.gearEvents.subscribeToTransferEvents(
  ({ data: { from, to, amount } }) => {
    console.log(`
    Transfer balance:
    from: ${from.toHex()}
    to: ${to.toHex()}
    amount: ${+amount.toString()}
    `);
  },
);
// Unsubscribe
unsub();

Subscribe to new blocks

const unsub = await api.gearEvents.subscribeToNewBlocks((header) => {
  console.log(
    `New block with number: ${header.number.toNumber()} and hash: ${header.hash.toHex()}`,
  );
});
// Unsubscribe
unsub();

On this page