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