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    AccountVaultBeforeMintAsset = ACCOUNT_VAULT_BEFORE_MINT_ASSET_ID,
31    AccountVaultBeforeBurnAsset = ACCOUNT_VAULT_BEFORE_BURN_ASSET_ID,
32
33    AccountBeforeAssetDeltaComputation = ACCOUNT_BEFORE_ASSET_DELTA_COMPUTATION_ID,
34    AccountOnAssetDeltaComputation = ACCOUNT_ON_ASSET_DELTA_COMPUTATION_ID,
35
36    AccountVaultBeforeGetAsset = ACCOUNT_VAULT_BEFORE_GET_ASSET_ID,
37
38    AccountStorageBeforeSetItem = ACCOUNT_STORAGE_BEFORE_SET_ITEM_ID,
39    AccountStorageAfterSetItem = ACCOUNT_STORAGE_AFTER_SET_ITEM_ID,
40
41    AccountStorageBeforeGetMapItem = ACCOUNT_STORAGE_BEFORE_GET_MAP_ITEM_ID,
42
43    AccountStorageBeforeSetMapItem = ACCOUNT_STORAGE_BEFORE_SET_MAP_ITEM_ID,
44    AccountStorageAfterSetMapItem = ACCOUNT_STORAGE_AFTER_SET_MAP_ITEM_ID,
45
46    AccountBeforeIncrementNonce = ACCOUNT_BEFORE_INCREMENT_NONCE_ID,
47    AccountAfterIncrementNonce = ACCOUNT_AFTER_INCREMENT_NONCE_ID,
48
49    AccountPushProcedureIndex = ACCOUNT_PUSH_PROCEDURE_INDEX_ID,
50
51    AccountBeforeCodeUpgrade = ACCOUNT_BEFORE_CODE_UPGRADE_ID,
52
53    NoteBeforeCreated = NOTE_BEFORE_CREATED_ID,
54    NoteAfterCreated = NOTE_AFTER_CREATED_ID,
55
56    NoteBeforeAddAsset = NOTE_BEFORE_ADD_ASSET_ID,
57    NoteAfterAddAsset = NOTE_AFTER_ADD_ASSET_ID,
58
59    NoteBeforeAddAttachment = NOTE_BEFORE_ADD_ATTACHMENT_ID,
60
61    InputNoteIndexLookup = INPUT_NOTE_INDEX_LOOKUP_ID,
62
63    TxBeforeBlockWitnessLoad = TX_BEFORE_BLOCK_WITNESS_LOAD_ID,
64
65    AuthRequest = AUTH_REQUEST_ID,
66
67    PrologueStart = PROLOGUE_START_ID,
68    PrologueEnd = PROLOGUE_END_ID,
69
70    NotesProcessingStart = NOTES_PROCESSING_START_ID,
71    NotesProcessingEnd = NOTES_PROCESSING_END_ID,
72
73    NoteExecutionStart = NOTE_EXECUTION_START_ID,
74    NoteExecutionEnd = NOTE_EXECUTION_END_ID,
75
76    TxScriptProcessingStart = TX_SCRIPT_PROCESSING_START_ID,
77    TxScriptProcessingEnd = TX_SCRIPT_PROCESSING_END_ID,
78
79    EpilogueStart = EPILOGUE_START_ID,
80    EpilogueEnd = EPILOGUE_END_ID,
81
82    EpilogueAuthProcStart = EPILOGUE_AUTH_PROC_START_ID,
83    EpilogueAuthProcEnd = EPILOGUE_AUTH_PROC_END_ID,
84
85    LinkMapSet = LINK_MAP_SET_ID,
86    LinkMapGet = LINK_MAP_GET_ID,
87
88    Unauthorized = AUTH_UNAUTHORIZED_ID,
89}
90
91impl TransactionEventId {
92    /// Returns `true` if the event is privileged, i.e. it is only allowed to be emitted from the
93    /// root context of the VM, which is where the transaction kernel executes.
94    ///
95    /// The host enforces this: a privileged event emitted from a non-root context is rejected.
96    pub fn is_privileged(&self) -> bool {
97        let is_unprivileged =
98            matches!(self, Self::AuthRequest | Self::InputNoteIndexLookup | Self::Unauthorized);
99        !is_unprivileged
100    }
101
102    /// Returns the [`EventId`] of the transaction event.
103    pub fn event_id(&self) -> EventId {
104        EventId::from_u64(self.clone() as u64)
105    }
106
107    /// Returns the [`EventName`] of the transaction event.
108    pub fn event_name(&self) -> &'static EventName {
109        match self {
110            Self::AccountBeforeForeignLoad => &ACCOUNT_BEFORE_FOREIGN_LOAD_NAME,
111            Self::AccountVaultBeforeAddAsset => &ACCOUNT_VAULT_BEFORE_ADD_ASSET_NAME,
112            Self::AccountVaultAfterAddAsset => &ACCOUNT_VAULT_AFTER_ADD_ASSET_NAME,
113            Self::AccountVaultBeforeRemoveAsset => &ACCOUNT_VAULT_BEFORE_REMOVE_ASSET_NAME,
114            Self::AccountVaultAfterRemoveAsset => &ACCOUNT_VAULT_AFTER_REMOVE_ASSET_NAME,
115            Self::AccountVaultBeforeMintAsset => &ACCOUNT_VAULT_BEFORE_MINT_ASSET_NAME,
116            Self::AccountVaultBeforeBurnAsset => &ACCOUNT_VAULT_BEFORE_BURN_ASSET_NAME,
117            Self::AccountBeforeAssetDeltaComputation => {
118                &ACCOUNT_BEFORE_ASSET_DELTA_COMPUTATION_NAME
119            },
120            Self::AccountOnAssetDeltaComputation => &ACCOUNT_ON_ASSET_DELTA_COMPUTATION_NAME,
121            Self::AccountVaultBeforeGetAsset => &ACCOUNT_VAULT_BEFORE_GET_ASSET_NAME,
122            Self::AccountStorageBeforeSetItem => &ACCOUNT_STORAGE_BEFORE_SET_ITEM_NAME,
123            Self::AccountStorageAfterSetItem => &ACCOUNT_STORAGE_AFTER_SET_ITEM_NAME,
124            Self::AccountStorageBeforeGetMapItem => &ACCOUNT_STORAGE_BEFORE_GET_MAP_ITEM_NAME,
125            Self::AccountStorageBeforeSetMapItem => &ACCOUNT_STORAGE_BEFORE_SET_MAP_ITEM_NAME,
126            Self::AccountStorageAfterSetMapItem => &ACCOUNT_STORAGE_AFTER_SET_MAP_ITEM_NAME,
127            Self::AccountBeforeIncrementNonce => &ACCOUNT_BEFORE_INCREMENT_NONCE_NAME,
128            Self::AccountAfterIncrementNonce => &ACCOUNT_AFTER_INCREMENT_NONCE_NAME,
129            Self::AccountPushProcedureIndex => &ACCOUNT_PUSH_PROCEDURE_INDEX_NAME,
130            Self::AccountBeforeCodeUpgrade => &ACCOUNT_BEFORE_CODE_UPGRADE_NAME,
131            Self::NoteBeforeCreated => &NOTE_BEFORE_CREATED_NAME,
132            Self::NoteAfterCreated => &NOTE_AFTER_CREATED_NAME,
133            Self::NoteBeforeAddAsset => &NOTE_BEFORE_ADD_ASSET_NAME,
134            Self::NoteAfterAddAsset => &NOTE_AFTER_ADD_ASSET_NAME,
135            Self::NoteBeforeAddAttachment => &NOTE_BEFORE_ADD_ATTACHMENT_NAME,
136            Self::InputNoteIndexLookup => &INPUT_NOTE_INDEX_LOOKUP_NAME,
137            Self::TxBeforeBlockWitnessLoad => &TX_BEFORE_BLOCK_WITNESS_LOAD_NAME,
138            Self::AuthRequest => &AUTH_REQUEST_NAME,
139            Self::PrologueStart => &PROLOGUE_START_NAME,
140            Self::PrologueEnd => &PROLOGUE_END_NAME,
141            Self::NotesProcessingStart => &NOTES_PROCESSING_START_NAME,
142            Self::NotesProcessingEnd => &NOTES_PROCESSING_END_NAME,
143            Self::NoteExecutionStart => &NOTE_EXECUTION_START_NAME,
144            Self::NoteExecutionEnd => &NOTE_EXECUTION_END_NAME,
145            Self::TxScriptProcessingStart => &TX_SCRIPT_PROCESSING_START_NAME,
146            Self::TxScriptProcessingEnd => &TX_SCRIPT_PROCESSING_END_NAME,
147            Self::EpilogueStart => &EPILOGUE_START_NAME,
148            Self::EpilogueEnd => &EPILOGUE_END_NAME,
149            Self::EpilogueAuthProcStart => &EPILOGUE_AUTH_PROC_START_NAME,
150            Self::EpilogueAuthProcEnd => &EPILOGUE_AUTH_PROC_END_NAME,
151            Self::LinkMapSet => &LINK_MAP_SET_NAME,
152            Self::LinkMapGet => &LINK_MAP_GET_NAME,
153            Self::Unauthorized => &AUTH_UNAUTHORIZED_NAME,
154        }
155    }
156}
157
158impl fmt::Display for TransactionEventId {
159    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
160        write!(f, "{}", self.event_name())
161    }
162}
163
164impl TryFrom<EventId> for TransactionEventId {
165    type Error = TransactionEventError;
166
167    fn try_from(event_id: EventId) -> Result<Self, Self::Error> {
168        let raw = event_id.as_felt().as_canonical_u64();
169
170        match raw {
171            ACCOUNT_BEFORE_FOREIGN_LOAD_ID => Ok(TransactionEventId::AccountBeforeForeignLoad),
172
173            ACCOUNT_VAULT_BEFORE_ADD_ASSET_ID => Ok(TransactionEventId::AccountVaultBeforeAddAsset),
174            ACCOUNT_VAULT_AFTER_ADD_ASSET_ID => Ok(TransactionEventId::AccountVaultAfterAddAsset),
175
176            ACCOUNT_VAULT_BEFORE_REMOVE_ASSET_ID => {
177                Ok(TransactionEventId::AccountVaultBeforeRemoveAsset)
178            },
179            ACCOUNT_VAULT_AFTER_REMOVE_ASSET_ID => {
180                Ok(TransactionEventId::AccountVaultAfterRemoveAsset)
181            },
182
183            ACCOUNT_VAULT_BEFORE_MINT_ASSET_ID => {
184                Ok(TransactionEventId::AccountVaultBeforeMintAsset)
185            },
186            ACCOUNT_VAULT_BEFORE_BURN_ASSET_ID => {
187                Ok(TransactionEventId::AccountVaultBeforeBurnAsset)
188            },
189
190            ACCOUNT_ON_ASSET_DELTA_COMPUTATION_ID => {
191                Ok(TransactionEventId::AccountOnAssetDeltaComputation)
192            },
193            ACCOUNT_BEFORE_ASSET_DELTA_COMPUTATION_ID => {
194                Ok(TransactionEventId::AccountBeforeAssetDeltaComputation)
195            },
196
197            ACCOUNT_VAULT_BEFORE_GET_ASSET_ID => Ok(TransactionEventId::AccountVaultBeforeGetAsset),
198
199            ACCOUNT_STORAGE_BEFORE_SET_ITEM_ID => {
200                Ok(TransactionEventId::AccountStorageBeforeSetItem)
201            },
202            ACCOUNT_STORAGE_AFTER_SET_ITEM_ID => Ok(TransactionEventId::AccountStorageAfterSetItem),
203
204            ACCOUNT_STORAGE_BEFORE_GET_MAP_ITEM_ID => {
205                Ok(TransactionEventId::AccountStorageBeforeGetMapItem)
206            },
207
208            ACCOUNT_STORAGE_BEFORE_SET_MAP_ITEM_ID => {
209                Ok(TransactionEventId::AccountStorageBeforeSetMapItem)
210            },
211            ACCOUNT_STORAGE_AFTER_SET_MAP_ITEM_ID => {
212                Ok(TransactionEventId::AccountStorageAfterSetMapItem)
213            },
214
215            ACCOUNT_BEFORE_INCREMENT_NONCE_ID => {
216                Ok(TransactionEventId::AccountBeforeIncrementNonce)
217            },
218            ACCOUNT_AFTER_INCREMENT_NONCE_ID => Ok(TransactionEventId::AccountAfterIncrementNonce),
219
220            ACCOUNT_PUSH_PROCEDURE_INDEX_ID => Ok(TransactionEventId::AccountPushProcedureIndex),
221
222            ACCOUNT_BEFORE_CODE_UPGRADE_ID => Ok(TransactionEventId::AccountBeforeCodeUpgrade),
223
224            NOTE_BEFORE_CREATED_ID => Ok(TransactionEventId::NoteBeforeCreated),
225            NOTE_AFTER_CREATED_ID => Ok(TransactionEventId::NoteAfterCreated),
226
227            NOTE_BEFORE_ADD_ASSET_ID => Ok(TransactionEventId::NoteBeforeAddAsset),
228            NOTE_AFTER_ADD_ASSET_ID => Ok(TransactionEventId::NoteAfterAddAsset),
229
230            NOTE_BEFORE_ADD_ATTACHMENT_ID => Ok(TransactionEventId::NoteBeforeAddAttachment),
231
232            INPUT_NOTE_INDEX_LOOKUP_ID => Ok(TransactionEventId::InputNoteIndexLookup),
233
234            TX_BEFORE_BLOCK_WITNESS_LOAD_ID => Ok(TransactionEventId::TxBeforeBlockWitnessLoad),
235
236            AUTH_REQUEST_ID => Ok(TransactionEventId::AuthRequest),
237
238            PROLOGUE_START_ID => Ok(TransactionEventId::PrologueStart),
239            PROLOGUE_END_ID => Ok(TransactionEventId::PrologueEnd),
240
241            NOTES_PROCESSING_START_ID => Ok(TransactionEventId::NotesProcessingStart),
242            NOTES_PROCESSING_END_ID => Ok(TransactionEventId::NotesProcessingEnd),
243
244            NOTE_EXECUTION_START_ID => Ok(TransactionEventId::NoteExecutionStart),
245            NOTE_EXECUTION_END_ID => Ok(TransactionEventId::NoteExecutionEnd),
246
247            TX_SCRIPT_PROCESSING_START_ID => Ok(TransactionEventId::TxScriptProcessingStart),
248            TX_SCRIPT_PROCESSING_END_ID => Ok(TransactionEventId::TxScriptProcessingEnd),
249
250            EPILOGUE_START_ID => Ok(TransactionEventId::EpilogueStart),
251            EPILOGUE_AUTH_PROC_START_ID => Ok(TransactionEventId::EpilogueAuthProcStart),
252            EPILOGUE_AUTH_PROC_END_ID => Ok(TransactionEventId::EpilogueAuthProcEnd),
253            EPILOGUE_END_ID => Ok(TransactionEventId::EpilogueEnd),
254
255            LINK_MAP_SET_ID => Ok(TransactionEventId::LinkMapSet),
256            LINK_MAP_GET_ID => Ok(TransactionEventId::LinkMapGet),
257
258            AUTH_UNAUTHORIZED_ID => Ok(TransactionEventId::Unauthorized),
259
260            _ => Err(TransactionEventError::InvalidTransactionEvent(event_id)),
261        }
262    }
263}