Skip to main content

miden_protocol/transaction/kernel/
tx_event_id.rs

1use core::fmt;
2
3use miden_core::EventId;
4
5use crate::errors::TransactionEventError;
6
7// CONSTANTS
8// ================================================================================================
9// Include the generated event constants
10include!(concat!(env!("OUT_DIR"), "/assets/transaction_events.rs"));
11
12// TRANSACTION EVENT
13// ================================================================================================
14
15/// Events which may be emitted by a transaction kernel.
16///
17/// The events are emitted via the `emit.<event_id>` instruction. The event ID is a Felt
18/// derived from the `EventId` string which is used to identify the event type. Events emitted
19/// by the transaction kernel are in the `miden` namespace.
20#[repr(u64)]
21#[derive(Debug, Clone, Eq, PartialEq)]
22pub enum TransactionEventId {
23    AccountBeforeForeignLoad = ACCOUNT_BEFORE_FOREIGN_LOAD,
24
25    AccountVaultBeforeAddAsset = ACCOUNT_VAULT_BEFORE_ADD_ASSET,
26    AccountVaultAfterAddAsset = ACCOUNT_VAULT_AFTER_ADD_ASSET,
27
28    AccountVaultBeforeRemoveAsset = ACCOUNT_VAULT_BEFORE_REMOVE_ASSET,
29    AccountVaultAfterRemoveAsset = ACCOUNT_VAULT_AFTER_REMOVE_ASSET,
30
31    AccountVaultBeforeGetAsset = ACCOUNT_VAULT_BEFORE_GET_ASSET,
32
33    AccountStorageBeforeSetItem = ACCOUNT_STORAGE_BEFORE_SET_ITEM,
34    AccountStorageAfterSetItem = ACCOUNT_STORAGE_AFTER_SET_ITEM,
35
36    AccountStorageBeforeGetMapItem = ACCOUNT_STORAGE_BEFORE_GET_MAP_ITEM,
37
38    AccountStorageBeforeSetMapItem = ACCOUNT_STORAGE_BEFORE_SET_MAP_ITEM,
39    AccountStorageAfterSetMapItem = ACCOUNT_STORAGE_AFTER_SET_MAP_ITEM,
40
41    AccountBeforeIncrementNonce = ACCOUNT_BEFORE_INCREMENT_NONCE,
42    AccountAfterIncrementNonce = ACCOUNT_AFTER_INCREMENT_NONCE,
43
44    AccountPushProcedureIndex = ACCOUNT_PUSH_PROCEDURE_INDEX,
45
46    NoteBeforeCreated = NOTE_BEFORE_CREATED,
47    NoteAfterCreated = NOTE_AFTER_CREATED,
48
49    NoteBeforeAddAsset = NOTE_BEFORE_ADD_ASSET,
50    NoteAfterAddAsset = NOTE_AFTER_ADD_ASSET,
51
52    NoteBeforeSetAttachment = NOTE_BEFORE_SET_ATTACHMENT,
53
54    AuthRequest = AUTH_REQUEST,
55
56    PrologueStart = PROLOGUE_START,
57    PrologueEnd = PROLOGUE_END,
58
59    NotesProcessingStart = NOTES_PROCESSING_START,
60    NotesProcessingEnd = NOTES_PROCESSING_END,
61
62    NoteExecutionStart = NOTE_EXECUTION_START,
63    NoteExecutionEnd = NOTE_EXECUTION_END,
64
65    TxScriptProcessingStart = TX_SCRIPT_PROCESSING_START,
66    TxScriptProcessingEnd = TX_SCRIPT_PROCESSING_END,
67
68    EpilogueStart = EPILOGUE_START,
69    EpilogueEnd = EPILOGUE_END,
70
71    EpilogueAuthProcStart = EPILOGUE_AUTH_PROC_START,
72    EpilogueAuthProcEnd = EPILOGUE_AUTH_PROC_END,
73
74    EpilogueAfterTxCyclesObtained = EPILOGUE_AFTER_TX_CYCLES_OBTAINED,
75    EpilogueBeforeTxFeeRemovedFromAccount = EPILOGUE_BEFORE_TX_FEE_REMOVED_FROM_ACCOUNT,
76
77    LinkMapSet = LINK_MAP_SET,
78    LinkMapGet = LINK_MAP_GET,
79
80    Unauthorized = AUTH_UNAUTHORIZED,
81}
82
83impl TransactionEventId {
84    /// Returns `true` if the event is privileged, i.e. it is only allowed to be emitted from the
85    /// root context of the VM, which is where the transaction kernel executes.
86    pub fn is_privileged(&self) -> bool {
87        let is_unprivileged = matches!(self, Self::AuthRequest | Self::Unauthorized);
88        !is_unprivileged
89    }
90
91    /// Returns the [`EventId`] of the transaction event.
92    pub fn event_id(&self) -> EventId {
93        EventId::from_u64(self.clone() as u64)
94    }
95}
96
97impl fmt::Display for TransactionEventId {
98    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
99        write!(f, "{self:?}")
100    }
101}
102
103impl TryFrom<EventId> for TransactionEventId {
104    type Error = TransactionEventError;
105
106    fn try_from(event_id: EventId) -> Result<Self, Self::Error> {
107        let raw = event_id.as_felt().as_int();
108
109        let name = EVENT_NAME_LUT.get(&raw).copied();
110
111        match raw {
112            ACCOUNT_BEFORE_FOREIGN_LOAD => Ok(TransactionEventId::AccountBeforeForeignLoad),
113
114            ACCOUNT_VAULT_BEFORE_ADD_ASSET => Ok(TransactionEventId::AccountVaultBeforeAddAsset),
115            ACCOUNT_VAULT_AFTER_ADD_ASSET => Ok(TransactionEventId::AccountVaultAfterAddAsset),
116
117            ACCOUNT_VAULT_BEFORE_REMOVE_ASSET => {
118                Ok(TransactionEventId::AccountVaultBeforeRemoveAsset)
119            },
120            ACCOUNT_VAULT_AFTER_REMOVE_ASSET => {
121                Ok(TransactionEventId::AccountVaultAfterRemoveAsset)
122            },
123
124            ACCOUNT_VAULT_BEFORE_GET_ASSET => Ok(TransactionEventId::AccountVaultBeforeGetAsset),
125
126            ACCOUNT_STORAGE_BEFORE_SET_ITEM => Ok(TransactionEventId::AccountStorageBeforeSetItem),
127            ACCOUNT_STORAGE_AFTER_SET_ITEM => Ok(TransactionEventId::AccountStorageAfterSetItem),
128
129            ACCOUNT_STORAGE_BEFORE_GET_MAP_ITEM => {
130                Ok(TransactionEventId::AccountStorageBeforeGetMapItem)
131            },
132
133            ACCOUNT_STORAGE_BEFORE_SET_MAP_ITEM => {
134                Ok(TransactionEventId::AccountStorageBeforeSetMapItem)
135            },
136            ACCOUNT_STORAGE_AFTER_SET_MAP_ITEM => {
137                Ok(TransactionEventId::AccountStorageAfterSetMapItem)
138            },
139
140            ACCOUNT_BEFORE_INCREMENT_NONCE => Ok(TransactionEventId::AccountBeforeIncrementNonce),
141            ACCOUNT_AFTER_INCREMENT_NONCE => Ok(TransactionEventId::AccountAfterIncrementNonce),
142
143            ACCOUNT_PUSH_PROCEDURE_INDEX => Ok(TransactionEventId::AccountPushProcedureIndex),
144
145            NOTE_BEFORE_CREATED => Ok(TransactionEventId::NoteBeforeCreated),
146            NOTE_AFTER_CREATED => Ok(TransactionEventId::NoteAfterCreated),
147
148            NOTE_BEFORE_ADD_ASSET => Ok(TransactionEventId::NoteBeforeAddAsset),
149            NOTE_AFTER_ADD_ASSET => Ok(TransactionEventId::NoteAfterAddAsset),
150
151            NOTE_BEFORE_SET_ATTACHMENT => Ok(TransactionEventId::NoteBeforeSetAttachment),
152
153            AUTH_REQUEST => Ok(TransactionEventId::AuthRequest),
154
155            PROLOGUE_START => Ok(TransactionEventId::PrologueStart),
156            PROLOGUE_END => Ok(TransactionEventId::PrologueEnd),
157
158            NOTES_PROCESSING_START => Ok(TransactionEventId::NotesProcessingStart),
159            NOTES_PROCESSING_END => Ok(TransactionEventId::NotesProcessingEnd),
160
161            NOTE_EXECUTION_START => Ok(TransactionEventId::NoteExecutionStart),
162            NOTE_EXECUTION_END => Ok(TransactionEventId::NoteExecutionEnd),
163
164            TX_SCRIPT_PROCESSING_START => Ok(TransactionEventId::TxScriptProcessingStart),
165            TX_SCRIPT_PROCESSING_END => Ok(TransactionEventId::TxScriptProcessingEnd),
166
167            EPILOGUE_START => Ok(TransactionEventId::EpilogueStart),
168            EPILOGUE_AUTH_PROC_START => Ok(TransactionEventId::EpilogueAuthProcStart),
169            EPILOGUE_AUTH_PROC_END => Ok(TransactionEventId::EpilogueAuthProcEnd),
170            EPILOGUE_AFTER_TX_CYCLES_OBTAINED => {
171                Ok(TransactionEventId::EpilogueAfterTxCyclesObtained)
172            },
173            EPILOGUE_BEFORE_TX_FEE_REMOVED_FROM_ACCOUNT => {
174                Ok(TransactionEventId::EpilogueBeforeTxFeeRemovedFromAccount)
175            },
176            EPILOGUE_END => Ok(TransactionEventId::EpilogueEnd),
177
178            LINK_MAP_SET => Ok(TransactionEventId::LinkMapSet),
179            LINK_MAP_GET => Ok(TransactionEventId::LinkMapGet),
180
181            AUTH_UNAUTHORIZED => Ok(TransactionEventId::Unauthorized),
182
183            _ => Err(TransactionEventError::InvalidTransactionEvent(event_id, name)),
184        }
185    }
186}