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 FALCON_SIG_TO_STACK: 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_END: u32 = 0x2_0019; // 131097
50
51/// Events which may be emitted by a transaction kernel.
52///
53/// The events are emitted via the `emit.<event_id>` instruction. The event ID is a 32-bit
54/// unsigned integer which is used to identify the event type. For events emitted by the
55/// transaction kernel, the event_id is structured as follows:
56/// - The upper 16 bits of the event ID are set to 2.
57/// - The lower 16 bits represent a unique event ID within the transaction kernel.
58#[repr(u32)]
59#[derive(Debug, Clone, Eq, PartialEq)]
60pub enum TransactionEvent {
61    AccountVaultBeforeAddAsset = ACCOUNT_VAULT_BEFORE_ADD_ASSET,
62    AccountVaultAfterAddAsset = ACCOUNT_VAULT_AFTER_ADD_ASSET,
63
64    AccountVaultBeforeRemoveAsset = ACCOUNT_VAULT_BEFORE_REMOVE_ASSET,
65    AccountVaultAfterRemoveAsset = ACCOUNT_VAULT_AFTER_REMOVE_ASSET,
66
67    AccountStorageBeforeSetItem = ACCOUNT_STORAGE_BEFORE_SET_ITEM,
68    AccountStorageAfterSetItem = ACCOUNT_STORAGE_AFTER_SET_ITEM,
69
70    AccountStorageBeforeSetMapItem = ACCOUNT_STORAGE_BEFORE_SET_MAP_ITEM,
71    AccountStorageAfterSetMapItem = ACCOUNT_STORAGE_AFTER_SET_MAP_ITEM,
72
73    AccountBeforeIncrementNonce = ACCOUNT_BEFORE_INCREMENT_NONCE,
74    AccountAfterIncrementNonce = ACCOUNT_AFTER_INCREMENT_NONCE,
75
76    AccountPushProcedureIndex = ACCOUNT_PUSH_PROCEDURE_INDEX,
77
78    NoteBeforeCreated = NOTE_BEFORE_CREATED,
79    NoteAfterCreated = NOTE_AFTER_CREATED,
80
81    NoteBeforeAddAsset = NOTE_BEFORE_ADD_ASSET,
82    NoteAfterAddAsset = NOTE_AFTER_ADD_ASSET,
83
84    FalconSigToStack = FALCON_SIG_TO_STACK,
85
86    PrologueStart = PROLOGUE_START,
87    PrologueEnd = PROLOGUE_END,
88
89    NotesProcessingStart = NOTES_PROCESSING_START,
90    NotesProcessingEnd = NOTES_PROCESSING_END,
91
92    NoteExecutionStart = NOTE_EXECUTION_START,
93    NoteExecutionEnd = NOTE_EXECUTION_END,
94
95    TxScriptProcessingStart = TX_SCRIPT_PROCESSING_START,
96    TxScriptProcessingEnd = TX_SCRIPT_PROCESSING_END,
97
98    EpilogueStart = EPILOGUE_START,
99    EpilogueEnd = EPILOGUE_END,
100}
101
102impl TransactionEvent {
103    /// Value of the top 16 bits of a transaction kernel event ID.
104    pub const ID_PREFIX: u32 = 2;
105}
106
107impl fmt::Display for TransactionEvent {
108    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
109        write!(f, "{self:?}")
110    }
111}
112
113impl TryFrom<u32> for TransactionEvent {
114    type Error = TransactionEventError;
115
116    fn try_from(value: u32) -> Result<Self, Self::Error> {
117        if value >> 16 != TransactionEvent::ID_PREFIX {
118            return Err(TransactionEventError::NotTransactionEvent(value));
119        }
120
121        match value {
122            ACCOUNT_VAULT_BEFORE_ADD_ASSET => Ok(TransactionEvent::AccountVaultBeforeAddAsset),
123            ACCOUNT_VAULT_AFTER_ADD_ASSET => Ok(TransactionEvent::AccountVaultAfterAddAsset),
124
125            ACCOUNT_VAULT_BEFORE_REMOVE_ASSET => {
126                Ok(TransactionEvent::AccountVaultBeforeRemoveAsset)
127            },
128            ACCOUNT_VAULT_AFTER_REMOVE_ASSET => Ok(TransactionEvent::AccountVaultAfterRemoveAsset),
129
130            ACCOUNT_STORAGE_BEFORE_SET_ITEM => Ok(TransactionEvent::AccountStorageBeforeSetItem),
131            ACCOUNT_STORAGE_AFTER_SET_ITEM => Ok(TransactionEvent::AccountStorageAfterSetItem),
132
133            ACCOUNT_STORAGE_BEFORE_SET_MAP_ITEM => {
134                Ok(TransactionEvent::AccountStorageBeforeSetMapItem)
135            },
136            ACCOUNT_STORAGE_AFTER_SET_MAP_ITEM => {
137                Ok(TransactionEvent::AccountStorageAfterSetMapItem)
138            },
139
140            ACCOUNT_BEFORE_INCREMENT_NONCE => Ok(TransactionEvent::AccountBeforeIncrementNonce),
141            ACCOUNT_AFTER_INCREMENT_NONCE => Ok(TransactionEvent::AccountAfterIncrementNonce),
142
143            ACCOUNT_PUSH_PROCEDURE_INDEX => Ok(TransactionEvent::AccountPushProcedureIndex),
144
145            NOTE_BEFORE_CREATED => Ok(TransactionEvent::NoteBeforeCreated),
146            NOTE_AFTER_CREATED => Ok(TransactionEvent::NoteAfterCreated),
147
148            NOTE_BEFORE_ADD_ASSET => Ok(TransactionEvent::NoteBeforeAddAsset),
149            NOTE_AFTER_ADD_ASSET => Ok(TransactionEvent::NoteAfterAddAsset),
150
151            FALCON_SIG_TO_STACK => Ok(TransactionEvent::FalconSigToStack),
152
153            PROLOGUE_START => Ok(TransactionEvent::PrologueStart),
154            PROLOGUE_END => Ok(TransactionEvent::PrologueEnd),
155
156            NOTES_PROCESSING_START => Ok(TransactionEvent::NotesProcessingStart),
157            NOTES_PROCESSING_END => Ok(TransactionEvent::NotesProcessingEnd),
158
159            NOTE_EXECUTION_START => Ok(TransactionEvent::NoteExecutionStart),
160            NOTE_EXECUTION_END => Ok(TransactionEvent::NoteExecutionEnd),
161
162            TX_SCRIPT_PROCESSING_START => Ok(TransactionEvent::TxScriptProcessingStart),
163            TX_SCRIPT_PROCESSING_END => Ok(TransactionEvent::TxScriptProcessingEnd),
164
165            EPILOGUE_START => Ok(TransactionEvent::EpilogueStart),
166            EPILOGUE_END => Ok(TransactionEvent::EpilogueEnd),
167
168            _ => Err(TransactionEventError::InvalidTransactionEvent(value)),
169        }
170    }
171}