Skip to main content

miden_protocol/transaction/kernel/
tx_event_id.rs

1use core::fmt;
2
3use crate::errors::TransactionEventError;
4use crate::vm::EventId;
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,
23
24    AccountVaultBeforeAddAsset = ACCOUNT_VAULT_BEFORE_ADD_ASSET,
25    AccountVaultAfterAddAsset = ACCOUNT_VAULT_AFTER_ADD_ASSET,
26
27    AccountVaultBeforeRemoveAsset = ACCOUNT_VAULT_BEFORE_REMOVE_ASSET,
28    AccountVaultAfterRemoveAsset = ACCOUNT_VAULT_AFTER_REMOVE_ASSET,
29
30    AccountVaultBeforeGetAsset = ACCOUNT_VAULT_BEFORE_GET_ASSET,
31
32    AccountStorageBeforeSetItem = ACCOUNT_STORAGE_BEFORE_SET_ITEM,
33    AccountStorageAfterSetItem = ACCOUNT_STORAGE_AFTER_SET_ITEM,
34
35    AccountStorageBeforeGetMapItem = ACCOUNT_STORAGE_BEFORE_GET_MAP_ITEM,
36
37    AccountStorageBeforeSetMapItem = ACCOUNT_STORAGE_BEFORE_SET_MAP_ITEM,
38    AccountStorageAfterSetMapItem = ACCOUNT_STORAGE_AFTER_SET_MAP_ITEM,
39
40    AccountBeforeIncrementNonce = ACCOUNT_BEFORE_INCREMENT_NONCE,
41    AccountAfterIncrementNonce = ACCOUNT_AFTER_INCREMENT_NONCE,
42
43    AccountPushProcedureIndex = ACCOUNT_PUSH_PROCEDURE_INDEX,
44
45    NoteBeforeCreated = NOTE_BEFORE_CREATED,
46    NoteAfterCreated = NOTE_AFTER_CREATED,
47
48    NoteBeforeAddAsset = NOTE_BEFORE_ADD_ASSET,
49    NoteAfterAddAsset = NOTE_AFTER_ADD_ASSET,
50
51    NoteBeforeSetAttachment = NOTE_BEFORE_SET_ATTACHMENT,
52
53    AuthRequest = AUTH_REQUEST,
54
55    PrologueStart = PROLOGUE_START,
56    PrologueEnd = PROLOGUE_END,
57
58    NotesProcessingStart = NOTES_PROCESSING_START,
59    NotesProcessingEnd = NOTES_PROCESSING_END,
60
61    NoteExecutionStart = NOTE_EXECUTION_START,
62    NoteExecutionEnd = NOTE_EXECUTION_END,
63
64    TxScriptProcessingStart = TX_SCRIPT_PROCESSING_START,
65    TxScriptProcessingEnd = TX_SCRIPT_PROCESSING_END,
66
67    EpilogueStart = EPILOGUE_START,
68    EpilogueEnd = EPILOGUE_END,
69
70    EpilogueAuthProcStart = EPILOGUE_AUTH_PROC_START,
71    EpilogueAuthProcEnd = EPILOGUE_AUTH_PROC_END,
72
73    EpilogueAfterTxCyclesObtained = EPILOGUE_AFTER_TX_CYCLES_OBTAINED,
74    EpilogueBeforeTxFeeRemovedFromAccount = EPILOGUE_BEFORE_TX_FEE_REMOVED_FROM_ACCOUNT,
75
76    LinkMapSet = LINK_MAP_SET,
77    LinkMapGet = LINK_MAP_GET,
78
79    Unauthorized = AUTH_UNAUTHORIZED,
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
96impl fmt::Display for TransactionEventId {
97    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
98        write!(f, "{self:?}")
99    }
100}
101
102impl TryFrom<EventId> for TransactionEventId {
103    type Error = TransactionEventError;
104
105    fn try_from(event_id: EventId) -> Result<Self, Self::Error> {
106        let raw = event_id.as_felt().as_canonical_u64();
107
108        let name = EVENT_NAME_LUT.get(&raw).copied();
109
110        match raw {
111            ACCOUNT_BEFORE_FOREIGN_LOAD => Ok(TransactionEventId::AccountBeforeForeignLoad),
112
113            ACCOUNT_VAULT_BEFORE_ADD_ASSET => Ok(TransactionEventId::AccountVaultBeforeAddAsset),
114            ACCOUNT_VAULT_AFTER_ADD_ASSET => Ok(TransactionEventId::AccountVaultAfterAddAsset),
115
116            ACCOUNT_VAULT_BEFORE_REMOVE_ASSET => {
117                Ok(TransactionEventId::AccountVaultBeforeRemoveAsset)
118            },
119            ACCOUNT_VAULT_AFTER_REMOVE_ASSET => {
120                Ok(TransactionEventId::AccountVaultAfterRemoveAsset)
121            },
122
123            ACCOUNT_VAULT_BEFORE_GET_ASSET => Ok(TransactionEventId::AccountVaultBeforeGetAsset),
124
125            ACCOUNT_STORAGE_BEFORE_SET_ITEM => Ok(TransactionEventId::AccountStorageBeforeSetItem),
126            ACCOUNT_STORAGE_AFTER_SET_ITEM => Ok(TransactionEventId::AccountStorageAfterSetItem),
127
128            ACCOUNT_STORAGE_BEFORE_GET_MAP_ITEM => {
129                Ok(TransactionEventId::AccountStorageBeforeGetMapItem)
130            },
131
132            ACCOUNT_STORAGE_BEFORE_SET_MAP_ITEM => {
133                Ok(TransactionEventId::AccountStorageBeforeSetMapItem)
134            },
135            ACCOUNT_STORAGE_AFTER_SET_MAP_ITEM => {
136                Ok(TransactionEventId::AccountStorageAfterSetMapItem)
137            },
138
139            ACCOUNT_BEFORE_INCREMENT_NONCE => Ok(TransactionEventId::AccountBeforeIncrementNonce),
140            ACCOUNT_AFTER_INCREMENT_NONCE => Ok(TransactionEventId::AccountAfterIncrementNonce),
141
142            ACCOUNT_PUSH_PROCEDURE_INDEX => Ok(TransactionEventId::AccountPushProcedureIndex),
143
144            NOTE_BEFORE_CREATED => Ok(TransactionEventId::NoteBeforeCreated),
145            NOTE_AFTER_CREATED => Ok(TransactionEventId::NoteAfterCreated),
146
147            NOTE_BEFORE_ADD_ASSET => Ok(TransactionEventId::NoteBeforeAddAsset),
148            NOTE_AFTER_ADD_ASSET => Ok(TransactionEventId::NoteAfterAddAsset),
149
150            NOTE_BEFORE_SET_ATTACHMENT => Ok(TransactionEventId::NoteBeforeSetAttachment),
151
152            AUTH_REQUEST => Ok(TransactionEventId::AuthRequest),
153
154            PROLOGUE_START => Ok(TransactionEventId::PrologueStart),
155            PROLOGUE_END => Ok(TransactionEventId::PrologueEnd),
156
157            NOTES_PROCESSING_START => Ok(TransactionEventId::NotesProcessingStart),
158            NOTES_PROCESSING_END => Ok(TransactionEventId::NotesProcessingEnd),
159
160            NOTE_EXECUTION_START => Ok(TransactionEventId::NoteExecutionStart),
161            NOTE_EXECUTION_END => Ok(TransactionEventId::NoteExecutionEnd),
162
163            TX_SCRIPT_PROCESSING_START => Ok(TransactionEventId::TxScriptProcessingStart),
164            TX_SCRIPT_PROCESSING_END => Ok(TransactionEventId::TxScriptProcessingEnd),
165
166            EPILOGUE_START => Ok(TransactionEventId::EpilogueStart),
167            EPILOGUE_AUTH_PROC_START => Ok(TransactionEventId::EpilogueAuthProcStart),
168            EPILOGUE_AUTH_PROC_END => Ok(TransactionEventId::EpilogueAuthProcEnd),
169            EPILOGUE_AFTER_TX_CYCLES_OBTAINED => {
170                Ok(TransactionEventId::EpilogueAfterTxCyclesObtained)
171            },
172            EPILOGUE_BEFORE_TX_FEE_REMOVED_FROM_ACCOUNT => {
173                Ok(TransactionEventId::EpilogueBeforeTxFeeRemovedFromAccount)
174            },
175            EPILOGUE_END => Ok(TransactionEventId::EpilogueEnd),
176
177            LINK_MAP_SET => Ok(TransactionEventId::LinkMapSet),
178            LINK_MAP_GET => Ok(TransactionEventId::LinkMapGet),
179
180            AUTH_UNAUTHORIZED => Ok(TransactionEventId::Unauthorized),
181
182            _ => Err(TransactionEventError::InvalidTransactionEvent(event_id, name)),
183        }
184    }
185}