miden_lib/transaction/
events.rs

1use core::fmt;
2
3use super::TransactionEventError;
4
5// CONSTANTS
6// ================================================================================================
7
8// TRANSACTION EVENT
9// ================================================================================================
10
11const ACCOUNT_VAULT_BEFORE_ADD_ASSET: u32 = 0x2_0000; // 131072
12const ACCOUNT_VAULT_AFTER_ADD_ASSET: u32 = 0x2_0001; // 131073
13
14const ACCOUNT_VAULT_BEFORE_REMOVE_ASSET: u32 = 0x2_0002; // 131074
15const ACCOUNT_VAULT_AFTER_REMOVE_ASSET: u32 = 0x2_0003; // 131075
16
17const ACCOUNT_STORAGE_BEFORE_SET_ITEM: u32 = 0x2_0004; // 131076
18const ACCOUNT_STORAGE_AFTER_SET_ITEM: u32 = 0x2_0005; // 131077
19
20const ACCOUNT_STORAGE_BEFORE_SET_MAP_ITEM: u32 = 0x2_0006; // 131078
21const ACCOUNT_STORAGE_AFTER_SET_MAP_ITEM: u32 = 0x2_0007; // 131079
22
23const ACCOUNT_BEFORE_INCREMENT_NONCE: u32 = 0x2_0008; // 131080
24const ACCOUNT_AFTER_INCREMENT_NONCE: u32 = 0x2_0009; // 131081
25
26const ACCOUNT_PUSH_PROCEDURE_INDEX: u32 = 0x2_000a; // 131082
27
28const NOTE_BEFORE_CREATED: u32 = 0x2_000b; // 131083
29const NOTE_AFTER_CREATED: u32 = 0x2_000c; // 131084
30
31const NOTE_BEFORE_ADD_ASSET: u32 = 0x2_000d; // 131085
32const NOTE_AFTER_ADD_ASSET: u32 = 0x2_000e; // 131086
33
34const AUTH_REQUEST: u32 = 0x2_000f; // 131087
35
36const PROLOGUE_START: u32 = 0x2_0010; // 131088
37const PROLOGUE_END: u32 = 0x2_0011; // 131089
38
39const NOTES_PROCESSING_START: u32 = 0x2_0012; // 131090
40const NOTES_PROCESSING_END: u32 = 0x2_0013; // 131091
41
42const NOTE_EXECUTION_START: u32 = 0x2_0014; // 131092
43const NOTE_EXECUTION_END: u32 = 0x2_0015; // 131093
44
45const TX_SCRIPT_PROCESSING_START: u32 = 0x2_0016; // 131094
46const TX_SCRIPT_PROCESSING_END: u32 = 0x2_0017; // 131095
47
48const EPILOGUE_START: u32 = 0x2_0018; // 131096
49const EPILOGUE_TX_CYCLES_OBTAINED: u32 = 0x2_0019; // 131097
50const EPILOGUE_TX_FEE_COMPUTED: u32 = 0x2_001a; // 131098
51const EPILOGUE_END: u32 = 0x2_001b; // 131099
52
53const LINK_MAP_SET_EVENT: u32 = 0x2_001c; // 131100
54const LINK_MAP_GET_EVENT: u32 = 0x2_001d; // 131101
55
56const UNAUTHORIZED_EVENT: u32 = 0x2_001e; // 131102
57
58/// Events which may be emitted by a transaction kernel.
59///
60/// The events are emitted via the `emit.<event_id>` instruction. The event ID is a 32-bit
61/// unsigned integer which is used to identify the event type. For events emitted by the
62/// transaction kernel, the event_id is structured as follows:
63/// - The upper 16 bits of the event ID are set to 2.
64/// - The lower 16 bits represent a unique event ID within the transaction kernel.
65#[repr(u32)]
66#[derive(Debug, Clone, Eq, PartialEq)]
67pub enum TransactionEvent {
68    AccountVaultBeforeAddAsset = ACCOUNT_VAULT_BEFORE_ADD_ASSET,
69    AccountVaultAfterAddAsset = ACCOUNT_VAULT_AFTER_ADD_ASSET,
70
71    AccountVaultBeforeRemoveAsset = ACCOUNT_VAULT_BEFORE_REMOVE_ASSET,
72    AccountVaultAfterRemoveAsset = ACCOUNT_VAULT_AFTER_REMOVE_ASSET,
73
74    AccountStorageBeforeSetItem = ACCOUNT_STORAGE_BEFORE_SET_ITEM,
75    AccountStorageAfterSetItem = ACCOUNT_STORAGE_AFTER_SET_ITEM,
76
77    AccountStorageBeforeSetMapItem = ACCOUNT_STORAGE_BEFORE_SET_MAP_ITEM,
78    AccountStorageAfterSetMapItem = ACCOUNT_STORAGE_AFTER_SET_MAP_ITEM,
79
80    AccountBeforeIncrementNonce = ACCOUNT_BEFORE_INCREMENT_NONCE,
81    AccountAfterIncrementNonce = ACCOUNT_AFTER_INCREMENT_NONCE,
82
83    AccountPushProcedureIndex = ACCOUNT_PUSH_PROCEDURE_INDEX,
84
85    NoteBeforeCreated = NOTE_BEFORE_CREATED,
86    NoteAfterCreated = NOTE_AFTER_CREATED,
87
88    NoteBeforeAddAsset = NOTE_BEFORE_ADD_ASSET,
89    NoteAfterAddAsset = NOTE_AFTER_ADD_ASSET,
90
91    AuthRequest = AUTH_REQUEST,
92
93    PrologueStart = PROLOGUE_START,
94    PrologueEnd = PROLOGUE_END,
95
96    NotesProcessingStart = NOTES_PROCESSING_START,
97    NotesProcessingEnd = NOTES_PROCESSING_END,
98
99    NoteExecutionStart = NOTE_EXECUTION_START,
100    NoteExecutionEnd = NOTE_EXECUTION_END,
101
102    TxScriptProcessingStart = TX_SCRIPT_PROCESSING_START,
103    TxScriptProcessingEnd = TX_SCRIPT_PROCESSING_END,
104
105    EpilogueStart = EPILOGUE_START,
106    EpilogueTxCyclesObtained = EPILOGUE_TX_CYCLES_OBTAINED,
107    EpilogueTxFeeComputed = EPILOGUE_TX_FEE_COMPUTED,
108    EpilogueEnd = EPILOGUE_END,
109
110    LinkMapSetEvent = LINK_MAP_SET_EVENT,
111    LinkMapGetEvent = LINK_MAP_GET_EVENT,
112
113    Unauthorized = UNAUTHORIZED_EVENT,
114}
115
116impl TransactionEvent {
117    /// Value of the top 16 bits of a transaction kernel event ID.
118    pub const ID_PREFIX: u32 = 2;
119
120    /// Returns `true` if the event is privileged, i.e. it is only allowed to be emitted from the
121    /// root context of the VM, which is where the transaction kernel executes.
122    pub fn is_privileged(&self) -> bool {
123        let is_unprivileged = matches!(self, Self::AuthRequest | Self::Unauthorized);
124        !is_unprivileged
125    }
126}
127
128impl fmt::Display for TransactionEvent {
129    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
130        write!(f, "{self:?}")
131    }
132}
133
134impl TryFrom<u32> for TransactionEvent {
135    type Error = TransactionEventError;
136
137    fn try_from(value: u32) -> Result<Self, Self::Error> {
138        if value >> 16 != TransactionEvent::ID_PREFIX {
139            return Err(TransactionEventError::NotTransactionEvent(value));
140        }
141
142        match value {
143            ACCOUNT_VAULT_BEFORE_ADD_ASSET => Ok(TransactionEvent::AccountVaultBeforeAddAsset),
144            ACCOUNT_VAULT_AFTER_ADD_ASSET => Ok(TransactionEvent::AccountVaultAfterAddAsset),
145
146            ACCOUNT_VAULT_BEFORE_REMOVE_ASSET => {
147                Ok(TransactionEvent::AccountVaultBeforeRemoveAsset)
148            },
149            ACCOUNT_VAULT_AFTER_REMOVE_ASSET => Ok(TransactionEvent::AccountVaultAfterRemoveAsset),
150
151            ACCOUNT_STORAGE_BEFORE_SET_ITEM => Ok(TransactionEvent::AccountStorageBeforeSetItem),
152            ACCOUNT_STORAGE_AFTER_SET_ITEM => Ok(TransactionEvent::AccountStorageAfterSetItem),
153
154            ACCOUNT_STORAGE_BEFORE_SET_MAP_ITEM => {
155                Ok(TransactionEvent::AccountStorageBeforeSetMapItem)
156            },
157            ACCOUNT_STORAGE_AFTER_SET_MAP_ITEM => {
158                Ok(TransactionEvent::AccountStorageAfterSetMapItem)
159            },
160
161            ACCOUNT_BEFORE_INCREMENT_NONCE => Ok(TransactionEvent::AccountBeforeIncrementNonce),
162            ACCOUNT_AFTER_INCREMENT_NONCE => Ok(TransactionEvent::AccountAfterIncrementNonce),
163
164            ACCOUNT_PUSH_PROCEDURE_INDEX => Ok(TransactionEvent::AccountPushProcedureIndex),
165
166            NOTE_BEFORE_CREATED => Ok(TransactionEvent::NoteBeforeCreated),
167            NOTE_AFTER_CREATED => Ok(TransactionEvent::NoteAfterCreated),
168
169            NOTE_BEFORE_ADD_ASSET => Ok(TransactionEvent::NoteBeforeAddAsset),
170            NOTE_AFTER_ADD_ASSET => Ok(TransactionEvent::NoteAfterAddAsset),
171
172            AUTH_REQUEST => Ok(TransactionEvent::AuthRequest),
173
174            PROLOGUE_START => Ok(TransactionEvent::PrologueStart),
175            PROLOGUE_END => Ok(TransactionEvent::PrologueEnd),
176
177            NOTES_PROCESSING_START => Ok(TransactionEvent::NotesProcessingStart),
178            NOTES_PROCESSING_END => Ok(TransactionEvent::NotesProcessingEnd),
179
180            NOTE_EXECUTION_START => Ok(TransactionEvent::NoteExecutionStart),
181            NOTE_EXECUTION_END => Ok(TransactionEvent::NoteExecutionEnd),
182
183            TX_SCRIPT_PROCESSING_START => Ok(TransactionEvent::TxScriptProcessingStart),
184            TX_SCRIPT_PROCESSING_END => Ok(TransactionEvent::TxScriptProcessingEnd),
185
186            EPILOGUE_START => Ok(TransactionEvent::EpilogueStart),
187            EPILOGUE_TX_CYCLES_OBTAINED => Ok(TransactionEvent::EpilogueTxCyclesObtained),
188            EPILOGUE_TX_FEE_COMPUTED => Ok(TransactionEvent::EpilogueTxFeeComputed),
189            EPILOGUE_END => Ok(TransactionEvent::EpilogueEnd),
190
191            LINK_MAP_SET_EVENT => Ok(TransactionEvent::LinkMapSetEvent),
192            LINK_MAP_GET_EVENT => Ok(TransactionEvent::LinkMapGetEvent),
193
194            UNAUTHORIZED_EVENT => Ok(TransactionEvent::Unauthorized),
195
196            _ => Err(TransactionEventError::InvalidTransactionEvent(value)),
197        }
198    }
199}