miden_lib/transaction/
events.rs

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