Skip to main content

miden_protocol/transaction/kernel/
tx_event_id.rs

1use core::fmt;
2
3use crate::errors::TransactionEventError;
4use crate::vm::{EventId, EventName};
5
6// CONSTANTS
7// ================================================================================================
8// Include the generated event constants
9include!(concat!(env!("OUT_DIR"), "/assets/transaction_events.rs"));
10
11// TRANSACTION EVENT
12// ================================================================================================
13
14/// Events which may be emitted by a transaction kernel.
15///
16/// The events are emitted via the `emit.<event_id>` instruction. The event ID is a Felt
17/// derived from the `EventId` string which is used to identify the event type. Events emitted
18/// by the transaction kernel are in the `miden` namespace.
19#[repr(u64)]
20#[derive(Debug, Clone, Eq, PartialEq)]
21pub enum TransactionEventId {
22    AccountBeforeForeignLoad = ACCOUNT_BEFORE_FOREIGN_LOAD_ID,
23
24    AccountVaultBeforeAddAsset = ACCOUNT_VAULT_BEFORE_ADD_ASSET_ID,
25    AccountVaultAfterAddAsset = ACCOUNT_VAULT_AFTER_ADD_ASSET_ID,
26
27    AccountVaultBeforeRemoveAsset = ACCOUNT_VAULT_BEFORE_REMOVE_ASSET_ID,
28    AccountVaultAfterRemoveAsset = ACCOUNT_VAULT_AFTER_REMOVE_ASSET_ID,
29
30    AccountVaultBeforeGetAsset = ACCOUNT_VAULT_BEFORE_GET_ASSET_ID,
31
32    AccountStorageBeforeSetItem = ACCOUNT_STORAGE_BEFORE_SET_ITEM_ID,
33    AccountStorageAfterSetItem = ACCOUNT_STORAGE_AFTER_SET_ITEM_ID,
34
35    AccountStorageBeforeGetMapItem = ACCOUNT_STORAGE_BEFORE_GET_MAP_ITEM_ID,
36
37    AccountStorageBeforeSetMapItem = ACCOUNT_STORAGE_BEFORE_SET_MAP_ITEM_ID,
38    AccountStorageAfterSetMapItem = ACCOUNT_STORAGE_AFTER_SET_MAP_ITEM_ID,
39
40    AccountBeforeIncrementNonce = ACCOUNT_BEFORE_INCREMENT_NONCE_ID,
41    AccountAfterIncrementNonce = ACCOUNT_AFTER_INCREMENT_NONCE_ID,
42
43    AccountPushProcedureIndex = ACCOUNT_PUSH_PROCEDURE_INDEX_ID,
44
45    NoteBeforeCreated = NOTE_BEFORE_CREATED_ID,
46    NoteAfterCreated = NOTE_AFTER_CREATED_ID,
47
48    NoteBeforeAddAsset = NOTE_BEFORE_ADD_ASSET_ID,
49    NoteAfterAddAsset = NOTE_AFTER_ADD_ASSET_ID,
50
51    NoteBeforeSetAttachment = NOTE_BEFORE_SET_ATTACHMENT_ID,
52
53    AuthRequest = AUTH_REQUEST_ID,
54
55    PrologueStart = PROLOGUE_START_ID,
56    PrologueEnd = PROLOGUE_END_ID,
57
58    NotesProcessingStart = NOTES_PROCESSING_START_ID,
59    NotesProcessingEnd = NOTES_PROCESSING_END_ID,
60
61    NoteExecutionStart = NOTE_EXECUTION_START_ID,
62    NoteExecutionEnd = NOTE_EXECUTION_END_ID,
63
64    TxScriptProcessingStart = TX_SCRIPT_PROCESSING_START_ID,
65    TxScriptProcessingEnd = TX_SCRIPT_PROCESSING_END_ID,
66
67    EpilogueStart = EPILOGUE_START_ID,
68    EpilogueEnd = EPILOGUE_END_ID,
69
70    EpilogueAuthProcStart = EPILOGUE_AUTH_PROC_START_ID,
71    EpilogueAuthProcEnd = EPILOGUE_AUTH_PROC_END_ID,
72
73    EpilogueAfterTxCyclesObtained = EPILOGUE_AFTER_TX_CYCLES_OBTAINED_ID,
74    EpilogueBeforeTxFeeRemovedFromAccount = EPILOGUE_BEFORE_TX_FEE_REMOVED_FROM_ACCOUNT_ID,
75
76    LinkMapSet = LINK_MAP_SET_ID,
77    LinkMapGet = LINK_MAP_GET_ID,
78
79    Unauthorized = AUTH_UNAUTHORIZED_ID,
80}
81
82impl TransactionEventId {
83    /// Returns `true` if the event is privileged, i.e. it is only allowed to be emitted from the
84    /// root context of the VM, which is where the transaction kernel executes.
85    pub fn is_privileged(&self) -> bool {
86        let is_unprivileged = matches!(self, Self::AuthRequest | Self::Unauthorized);
87        !is_unprivileged
88    }
89
90    /// Returns the [`EventId`] of the transaction event.
91    pub fn event_id(&self) -> EventId {
92        EventId::from_u64(self.clone() as u64)
93    }
94
95    /// Returns the [`EventName`] of the transaction event.
96    pub fn event_name(&self) -> &'static EventName {
97        match self {
98            Self::AccountBeforeForeignLoad => &ACCOUNT_BEFORE_FOREIGN_LOAD_NAME,
99            Self::AccountVaultBeforeAddAsset => &ACCOUNT_VAULT_BEFORE_ADD_ASSET_NAME,
100            Self::AccountVaultAfterAddAsset => &ACCOUNT_VAULT_AFTER_ADD_ASSET_NAME,
101            Self::AccountVaultBeforeRemoveAsset => &ACCOUNT_VAULT_BEFORE_REMOVE_ASSET_NAME,
102            Self::AccountVaultAfterRemoveAsset => &ACCOUNT_VAULT_AFTER_REMOVE_ASSET_NAME,
103            Self::AccountVaultBeforeGetAsset => &ACCOUNT_VAULT_BEFORE_GET_ASSET_NAME,
104            Self::AccountStorageBeforeSetItem => &ACCOUNT_STORAGE_BEFORE_SET_ITEM_NAME,
105            Self::AccountStorageAfterSetItem => &ACCOUNT_STORAGE_AFTER_SET_ITEM_NAME,
106            Self::AccountStorageBeforeGetMapItem => &ACCOUNT_STORAGE_BEFORE_GET_MAP_ITEM_NAME,
107            Self::AccountStorageBeforeSetMapItem => &ACCOUNT_STORAGE_BEFORE_SET_MAP_ITEM_NAME,
108            Self::AccountStorageAfterSetMapItem => &ACCOUNT_STORAGE_AFTER_SET_MAP_ITEM_NAME,
109            Self::AccountBeforeIncrementNonce => &ACCOUNT_BEFORE_INCREMENT_NONCE_NAME,
110            Self::AccountAfterIncrementNonce => &ACCOUNT_AFTER_INCREMENT_NONCE_NAME,
111            Self::AccountPushProcedureIndex => &ACCOUNT_PUSH_PROCEDURE_INDEX_NAME,
112            Self::NoteBeforeCreated => &NOTE_BEFORE_CREATED_NAME,
113            Self::NoteAfterCreated => &NOTE_AFTER_CREATED_NAME,
114            Self::NoteBeforeAddAsset => &NOTE_BEFORE_ADD_ASSET_NAME,
115            Self::NoteAfterAddAsset => &NOTE_AFTER_ADD_ASSET_NAME,
116            Self::NoteBeforeSetAttachment => &NOTE_BEFORE_SET_ATTACHMENT_NAME,
117            Self::AuthRequest => &AUTH_REQUEST_NAME,
118            Self::PrologueStart => &PROLOGUE_START_NAME,
119            Self::PrologueEnd => &PROLOGUE_END_NAME,
120            Self::NotesProcessingStart => &NOTES_PROCESSING_START_NAME,
121            Self::NotesProcessingEnd => &NOTES_PROCESSING_END_NAME,
122            Self::NoteExecutionStart => &NOTE_EXECUTION_START_NAME,
123            Self::NoteExecutionEnd => &NOTE_EXECUTION_END_NAME,
124            Self::TxScriptProcessingStart => &TX_SCRIPT_PROCESSING_START_NAME,
125            Self::TxScriptProcessingEnd => &TX_SCRIPT_PROCESSING_END_NAME,
126            Self::EpilogueStart => &EPILOGUE_START_NAME,
127            Self::EpilogueEnd => &EPILOGUE_END_NAME,
128            Self::EpilogueAuthProcStart => &EPILOGUE_AUTH_PROC_START_NAME,
129            Self::EpilogueAuthProcEnd => &EPILOGUE_AUTH_PROC_END_NAME,
130            Self::EpilogueAfterTxCyclesObtained => &EPILOGUE_AFTER_TX_CYCLES_OBTAINED_NAME,
131            Self::EpilogueBeforeTxFeeRemovedFromAccount => {
132                &EPILOGUE_BEFORE_TX_FEE_REMOVED_FROM_ACCOUNT_NAME
133            },
134            Self::LinkMapSet => &LINK_MAP_SET_NAME,
135            Self::LinkMapGet => &LINK_MAP_GET_NAME,
136            Self::Unauthorized => &AUTH_UNAUTHORIZED_NAME,
137        }
138    }
139}
140
141impl fmt::Display for TransactionEventId {
142    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
143        write!(f, "{}", self.event_name())
144    }
145}
146
147impl TryFrom<EventId> for TransactionEventId {
148    type Error = TransactionEventError;
149
150    fn try_from(event_id: EventId) -> Result<Self, Self::Error> {
151        let raw = event_id.as_felt().as_canonical_u64();
152
153        match raw {
154            ACCOUNT_BEFORE_FOREIGN_LOAD_ID => Ok(TransactionEventId::AccountBeforeForeignLoad),
155
156            ACCOUNT_VAULT_BEFORE_ADD_ASSET_ID => Ok(TransactionEventId::AccountVaultBeforeAddAsset),
157            ACCOUNT_VAULT_AFTER_ADD_ASSET_ID => Ok(TransactionEventId::AccountVaultAfterAddAsset),
158
159            ACCOUNT_VAULT_BEFORE_REMOVE_ASSET_ID => {
160                Ok(TransactionEventId::AccountVaultBeforeRemoveAsset)
161            },
162            ACCOUNT_VAULT_AFTER_REMOVE_ASSET_ID => {
163                Ok(TransactionEventId::AccountVaultAfterRemoveAsset)
164            },
165
166            ACCOUNT_VAULT_BEFORE_GET_ASSET_ID => Ok(TransactionEventId::AccountVaultBeforeGetAsset),
167
168            ACCOUNT_STORAGE_BEFORE_SET_ITEM_ID => {
169                Ok(TransactionEventId::AccountStorageBeforeSetItem)
170            },
171            ACCOUNT_STORAGE_AFTER_SET_ITEM_ID => Ok(TransactionEventId::AccountStorageAfterSetItem),
172
173            ACCOUNT_STORAGE_BEFORE_GET_MAP_ITEM_ID => {
174                Ok(TransactionEventId::AccountStorageBeforeGetMapItem)
175            },
176
177            ACCOUNT_STORAGE_BEFORE_SET_MAP_ITEM_ID => {
178                Ok(TransactionEventId::AccountStorageBeforeSetMapItem)
179            },
180            ACCOUNT_STORAGE_AFTER_SET_MAP_ITEM_ID => {
181                Ok(TransactionEventId::AccountStorageAfterSetMapItem)
182            },
183
184            ACCOUNT_BEFORE_INCREMENT_NONCE_ID => {
185                Ok(TransactionEventId::AccountBeforeIncrementNonce)
186            },
187            ACCOUNT_AFTER_INCREMENT_NONCE_ID => Ok(TransactionEventId::AccountAfterIncrementNonce),
188
189            ACCOUNT_PUSH_PROCEDURE_INDEX_ID => Ok(TransactionEventId::AccountPushProcedureIndex),
190
191            NOTE_BEFORE_CREATED_ID => Ok(TransactionEventId::NoteBeforeCreated),
192            NOTE_AFTER_CREATED_ID => Ok(TransactionEventId::NoteAfterCreated),
193
194            NOTE_BEFORE_ADD_ASSET_ID => Ok(TransactionEventId::NoteBeforeAddAsset),
195            NOTE_AFTER_ADD_ASSET_ID => Ok(TransactionEventId::NoteAfterAddAsset),
196
197            NOTE_BEFORE_SET_ATTACHMENT_ID => Ok(TransactionEventId::NoteBeforeSetAttachment),
198
199            AUTH_REQUEST_ID => Ok(TransactionEventId::AuthRequest),
200
201            PROLOGUE_START_ID => Ok(TransactionEventId::PrologueStart),
202            PROLOGUE_END_ID => Ok(TransactionEventId::PrologueEnd),
203
204            NOTES_PROCESSING_START_ID => Ok(TransactionEventId::NotesProcessingStart),
205            NOTES_PROCESSING_END_ID => Ok(TransactionEventId::NotesProcessingEnd),
206
207            NOTE_EXECUTION_START_ID => Ok(TransactionEventId::NoteExecutionStart),
208            NOTE_EXECUTION_END_ID => Ok(TransactionEventId::NoteExecutionEnd),
209
210            TX_SCRIPT_PROCESSING_START_ID => Ok(TransactionEventId::TxScriptProcessingStart),
211            TX_SCRIPT_PROCESSING_END_ID => Ok(TransactionEventId::TxScriptProcessingEnd),
212
213            EPILOGUE_START_ID => Ok(TransactionEventId::EpilogueStart),
214            EPILOGUE_AUTH_PROC_START_ID => Ok(TransactionEventId::EpilogueAuthProcStart),
215            EPILOGUE_AUTH_PROC_END_ID => Ok(TransactionEventId::EpilogueAuthProcEnd),
216            EPILOGUE_AFTER_TX_CYCLES_OBTAINED_ID => {
217                Ok(TransactionEventId::EpilogueAfterTxCyclesObtained)
218            },
219            EPILOGUE_BEFORE_TX_FEE_REMOVED_FROM_ACCOUNT_ID => {
220                Ok(TransactionEventId::EpilogueBeforeTxFeeRemovedFromAccount)
221            },
222            EPILOGUE_END_ID => Ok(TransactionEventId::EpilogueEnd),
223
224            LINK_MAP_SET_ID => Ok(TransactionEventId::LinkMapSet),
225            LINK_MAP_GET_ID => Ok(TransactionEventId::LinkMapGet),
226
227            AUTH_UNAUTHORIZED_ID => Ok(TransactionEventId::Unauthorized),
228
229            _ => Err(TransactionEventError::InvalidTransactionEvent(event_id)),
230        }
231    }
232}