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    AccountVaultBeforeGetBalance = ACCOUNT_VAULT_BEFORE_GET_BALANCE,
32
33    AccountVaultBeforeHasNonFungibleAsset = ACCOUNT_VAULT_BEFORE_HAS_NON_FUNGIBLE_ASSET,
34
35    AccountStorageBeforeSetItem = ACCOUNT_STORAGE_BEFORE_SET_ITEM,
36    AccountStorageAfterSetItem = ACCOUNT_STORAGE_AFTER_SET_ITEM,
37
38    AccountStorageBeforeGetMapItem = ACCOUNT_STORAGE_BEFORE_GET_MAP_ITEM,
39
40    AccountStorageBeforeSetMapItem = ACCOUNT_STORAGE_BEFORE_SET_MAP_ITEM,
41    AccountStorageAfterSetMapItem = ACCOUNT_STORAGE_AFTER_SET_MAP_ITEM,
42
43    AccountBeforeIncrementNonce = ACCOUNT_BEFORE_INCREMENT_NONCE,
44    AccountAfterIncrementNonce = ACCOUNT_AFTER_INCREMENT_NONCE,
45
46    AccountPushProcedureIndex = ACCOUNT_PUSH_PROCEDURE_INDEX,
47
48    NoteBeforeCreated = NOTE_BEFORE_CREATED,
49    NoteAfterCreated = NOTE_AFTER_CREATED,
50
51    NoteBeforeAddAsset = NOTE_BEFORE_ADD_ASSET,
52    NoteAfterAddAsset = NOTE_AFTER_ADD_ASSET,
53
54    NoteBeforeSetAttachment = NOTE_BEFORE_SET_ATTACHMENT,
55
56    AuthRequest = AUTH_REQUEST,
57
58    PrologueStart = PROLOGUE_START,
59    PrologueEnd = PROLOGUE_END,
60
61    NotesProcessingStart = NOTES_PROCESSING_START,
62    NotesProcessingEnd = NOTES_PROCESSING_END,
63
64    NoteExecutionStart = NOTE_EXECUTION_START,
65    NoteExecutionEnd = NOTE_EXECUTION_END,
66
67    TxScriptProcessingStart = TX_SCRIPT_PROCESSING_START,
68    TxScriptProcessingEnd = TX_SCRIPT_PROCESSING_END,
69
70    EpilogueStart = EPILOGUE_START,
71    EpilogueEnd = EPILOGUE_END,
72
73    EpilogueAuthProcStart = EPILOGUE_AUTH_PROC_START,
74    EpilogueAuthProcEnd = EPILOGUE_AUTH_PROC_END,
75
76    EpilogueAfterTxCyclesObtained = EPILOGUE_AFTER_TX_CYCLES_OBTAINED,
77    EpilogueBeforeTxFeeRemovedFromAccount = EPILOGUE_BEFORE_TX_FEE_REMOVED_FROM_ACCOUNT,
78
79    LinkMapSet = LINK_MAP_SET,
80    LinkMapGet = LINK_MAP_GET,
81
82    Unauthorized = AUTH_UNAUTHORIZED,
83}
84
85impl TransactionEventId {
86    /// Returns `true` if the event is privileged, i.e. it is only allowed to be emitted from the
87    /// root context of the VM, which is where the transaction kernel executes.
88    pub fn is_privileged(&self) -> bool {
89        let is_unprivileged = matches!(self, Self::AuthRequest | Self::Unauthorized);
90        !is_unprivileged
91    }
92
93    /// Returns the [`EventId`] of the transaction event.
94    pub fn event_id(&self) -> EventId {
95        EventId::from_u64(self.clone() as u64)
96    }
97}
98
99impl fmt::Display for TransactionEventId {
100    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
101        write!(f, "{self:?}")
102    }
103}
104
105impl TryFrom<EventId> for TransactionEventId {
106    type Error = TransactionEventError;
107
108    fn try_from(event_id: EventId) -> Result<Self, Self::Error> {
109        let raw = event_id.as_felt().as_int();
110
111        let name = EVENT_NAME_LUT.get(&raw).copied();
112
113        match raw {
114            ACCOUNT_BEFORE_FOREIGN_LOAD => Ok(TransactionEventId::AccountBeforeForeignLoad),
115
116            ACCOUNT_VAULT_BEFORE_ADD_ASSET => Ok(TransactionEventId::AccountVaultBeforeAddAsset),
117            ACCOUNT_VAULT_AFTER_ADD_ASSET => Ok(TransactionEventId::AccountVaultAfterAddAsset),
118
119            ACCOUNT_VAULT_BEFORE_REMOVE_ASSET => {
120                Ok(TransactionEventId::AccountVaultBeforeRemoveAsset)
121            },
122            ACCOUNT_VAULT_AFTER_REMOVE_ASSET => {
123                Ok(TransactionEventId::AccountVaultAfterRemoveAsset)
124            },
125
126            ACCOUNT_VAULT_BEFORE_GET_BALANCE => {
127                Ok(TransactionEventId::AccountVaultBeforeGetBalance)
128            },
129
130            ACCOUNT_VAULT_BEFORE_HAS_NON_FUNGIBLE_ASSET => {
131                Ok(TransactionEventId::AccountVaultBeforeHasNonFungibleAsset)
132            },
133
134            ACCOUNT_STORAGE_BEFORE_SET_ITEM => Ok(TransactionEventId::AccountStorageBeforeSetItem),
135            ACCOUNT_STORAGE_AFTER_SET_ITEM => Ok(TransactionEventId::AccountStorageAfterSetItem),
136
137            ACCOUNT_STORAGE_BEFORE_GET_MAP_ITEM => {
138                Ok(TransactionEventId::AccountStorageBeforeGetMapItem)
139            },
140
141            ACCOUNT_STORAGE_BEFORE_SET_MAP_ITEM => {
142                Ok(TransactionEventId::AccountStorageBeforeSetMapItem)
143            },
144            ACCOUNT_STORAGE_AFTER_SET_MAP_ITEM => {
145                Ok(TransactionEventId::AccountStorageAfterSetMapItem)
146            },
147
148            ACCOUNT_BEFORE_INCREMENT_NONCE => Ok(TransactionEventId::AccountBeforeIncrementNonce),
149            ACCOUNT_AFTER_INCREMENT_NONCE => Ok(TransactionEventId::AccountAfterIncrementNonce),
150
151            ACCOUNT_PUSH_PROCEDURE_INDEX => Ok(TransactionEventId::AccountPushProcedureIndex),
152
153            NOTE_BEFORE_CREATED => Ok(TransactionEventId::NoteBeforeCreated),
154            NOTE_AFTER_CREATED => Ok(TransactionEventId::NoteAfterCreated),
155
156            NOTE_BEFORE_ADD_ASSET => Ok(TransactionEventId::NoteBeforeAddAsset),
157            NOTE_AFTER_ADD_ASSET => Ok(TransactionEventId::NoteAfterAddAsset),
158
159            NOTE_BEFORE_SET_ATTACHMENT => Ok(TransactionEventId::NoteBeforeSetAttachment),
160
161            AUTH_REQUEST => Ok(TransactionEventId::AuthRequest),
162
163            PROLOGUE_START => Ok(TransactionEventId::PrologueStart),
164            PROLOGUE_END => Ok(TransactionEventId::PrologueEnd),
165
166            NOTES_PROCESSING_START => Ok(TransactionEventId::NotesProcessingStart),
167            NOTES_PROCESSING_END => Ok(TransactionEventId::NotesProcessingEnd),
168
169            NOTE_EXECUTION_START => Ok(TransactionEventId::NoteExecutionStart),
170            NOTE_EXECUTION_END => Ok(TransactionEventId::NoteExecutionEnd),
171
172            TX_SCRIPT_PROCESSING_START => Ok(TransactionEventId::TxScriptProcessingStart),
173            TX_SCRIPT_PROCESSING_END => Ok(TransactionEventId::TxScriptProcessingEnd),
174
175            EPILOGUE_START => Ok(TransactionEventId::EpilogueStart),
176            EPILOGUE_AUTH_PROC_START => Ok(TransactionEventId::EpilogueAuthProcStart),
177            EPILOGUE_AUTH_PROC_END => Ok(TransactionEventId::EpilogueAuthProcEnd),
178            EPILOGUE_AFTER_TX_CYCLES_OBTAINED => {
179                Ok(TransactionEventId::EpilogueAfterTxCyclesObtained)
180            },
181            EPILOGUE_BEFORE_TX_FEE_REMOVED_FROM_ACCOUNT => {
182                Ok(TransactionEventId::EpilogueBeforeTxFeeRemovedFromAccount)
183            },
184            EPILOGUE_END => Ok(TransactionEventId::EpilogueEnd),
185
186            LINK_MAP_SET => Ok(TransactionEventId::LinkMapSet),
187            LINK_MAP_GET => Ok(TransactionEventId::LinkMapGet),
188
189            AUTH_UNAUTHORIZED => Ok(TransactionEventId::Unauthorized),
190
191            _ => Err(TransactionEventError::InvalidTransactionEvent(event_id, name)),
192        }
193    }
194}