miden_lib/transaction/
events.rs

1use core::fmt;
2
3pub use miden_core::EventId;
4
5use super::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 TransactionEvent {
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    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 TransactionEvent {
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 TransactionEvent {
98    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
99        write!(f, "{self:?}")
100    }
101}
102
103impl TryFrom<EventId> for TransactionEvent {
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(TransactionEvent::AccountBeforeForeignLoad),
113
114            ACCOUNT_VAULT_BEFORE_ADD_ASSET => Ok(TransactionEvent::AccountVaultBeforeAddAsset),
115            ACCOUNT_VAULT_AFTER_ADD_ASSET => Ok(TransactionEvent::AccountVaultAfterAddAsset),
116
117            ACCOUNT_VAULT_BEFORE_REMOVE_ASSET => {
118                Ok(TransactionEvent::AccountVaultBeforeRemoveAsset)
119            },
120            ACCOUNT_VAULT_AFTER_REMOVE_ASSET => Ok(TransactionEvent::AccountVaultAfterRemoveAsset),
121
122            ACCOUNT_VAULT_BEFORE_GET_BALANCE => Ok(TransactionEvent::AccountVaultBeforeGetBalance),
123
124            ACCOUNT_VAULT_BEFORE_HAS_NON_FUNGIBLE_ASSET => {
125                Ok(TransactionEvent::AccountVaultBeforeHasNonFungibleAsset)
126            },
127
128            ACCOUNT_STORAGE_BEFORE_SET_ITEM => Ok(TransactionEvent::AccountStorageBeforeSetItem),
129            ACCOUNT_STORAGE_AFTER_SET_ITEM => Ok(TransactionEvent::AccountStorageAfterSetItem),
130
131            ACCOUNT_STORAGE_BEFORE_GET_MAP_ITEM => {
132                Ok(TransactionEvent::AccountStorageBeforeGetMapItem)
133            },
134
135            ACCOUNT_STORAGE_BEFORE_SET_MAP_ITEM => {
136                Ok(TransactionEvent::AccountStorageBeforeSetMapItem)
137            },
138            ACCOUNT_STORAGE_AFTER_SET_MAP_ITEM => {
139                Ok(TransactionEvent::AccountStorageAfterSetMapItem)
140            },
141
142            ACCOUNT_BEFORE_INCREMENT_NONCE => Ok(TransactionEvent::AccountBeforeIncrementNonce),
143            ACCOUNT_AFTER_INCREMENT_NONCE => Ok(TransactionEvent::AccountAfterIncrementNonce),
144
145            ACCOUNT_PUSH_PROCEDURE_INDEX => Ok(TransactionEvent::AccountPushProcedureIndex),
146
147            NOTE_BEFORE_CREATED => Ok(TransactionEvent::NoteBeforeCreated),
148            NOTE_AFTER_CREATED => Ok(TransactionEvent::NoteAfterCreated),
149
150            NOTE_BEFORE_ADD_ASSET => Ok(TransactionEvent::NoteBeforeAddAsset),
151            NOTE_AFTER_ADD_ASSET => Ok(TransactionEvent::NoteAfterAddAsset),
152
153            AUTH_REQUEST => Ok(TransactionEvent::AuthRequest),
154
155            PROLOGUE_START => Ok(TransactionEvent::PrologueStart),
156            PROLOGUE_END => Ok(TransactionEvent::PrologueEnd),
157
158            NOTES_PROCESSING_START => Ok(TransactionEvent::NotesProcessingStart),
159            NOTES_PROCESSING_END => Ok(TransactionEvent::NotesProcessingEnd),
160
161            NOTE_EXECUTION_START => Ok(TransactionEvent::NoteExecutionStart),
162            NOTE_EXECUTION_END => Ok(TransactionEvent::NoteExecutionEnd),
163
164            TX_SCRIPT_PROCESSING_START => Ok(TransactionEvent::TxScriptProcessingStart),
165            TX_SCRIPT_PROCESSING_END => Ok(TransactionEvent::TxScriptProcessingEnd),
166
167            EPILOGUE_START => Ok(TransactionEvent::EpilogueStart),
168            EPILOGUE_AUTH_PROC_START => Ok(TransactionEvent::EpilogueAuthProcStart),
169            EPILOGUE_AUTH_PROC_END => Ok(TransactionEvent::EpilogueAuthProcEnd),
170            EPILOGUE_AFTER_TX_CYCLES_OBTAINED => {
171                Ok(TransactionEvent::EpilogueAfterTxCyclesObtained)
172            },
173            EPILOGUE_BEFORE_TX_FEE_REMOVED_FROM_ACCOUNT => {
174                Ok(TransactionEvent::EpilogueBeforeTxFeeRemovedFromAccount)
175            },
176            EPILOGUE_END => Ok(TransactionEvent::EpilogueEnd),
177
178            LINK_MAP_SET => Ok(TransactionEvent::LinkMapSet),
179            LINK_MAP_GET => Ok(TransactionEvent::LinkMapGet),
180
181            AUTH_UNAUTHORIZED => Ok(TransactionEvent::Unauthorized),
182
183            _ => Err(TransactionEventError::InvalidTransactionEvent(event_id, name)),
184        }
185    }
186}