use core::fmt;
use super::{TransactionEventParsingError, TransactionTraceParsingError};
pub const EVENT_ID_PREFIX: u32 = 2;
const ACCOUNT_VAULT_BEFORE_ADD_ASSET: u32 = 0x2_0000; const ACCOUNT_VAULT_AFTER_ADD_ASSET: u32 = 0x2_0001; const ACCOUNT_VAULT_BEFORE_REMOVE_ASSET: u32 = 0x2_0002; const ACCOUNT_VAULT_AFTER_REMOVE_ASSET: u32 = 0x2_0003; const ACCOUNT_STORAGE_BEFORE_SET_ITEM: u32 = 0x2_0004; const ACCOUNT_STORAGE_AFTER_SET_ITEM: u32 = 0x2_0005; const ACCOUNT_STORAGE_BEFORE_SET_MAP_ITEM: u32 = 0x2_0006; const ACCOUNT_STORAGE_AFTER_SET_MAP_ITEM: u32 = 0x2_0007; const ACCOUNT_BEFORE_INCREMENT_NONCE: u32 = 0x2_0008; const ACCOUNT_AFTER_INCREMENT_NONCE: u32 = 0x2_0009; const ACCOUNT_PUSH_PROCEDURE_INDEX: u32 = 0x2_000A; const NOTE_BEFORE_CREATED: u32 = 0x2_000B; const NOTE_AFTER_CREATED: u32 = 0x2_000C; const NOTE_BEFORE_ADD_ASSET: u32 = 0x2_000D; const NOTE_AFTER_ADD_ASSET: u32 = 0x2_000E; #[repr(u32)]
#[derive(Debug, Clone, Eq, PartialEq)]
pub enum TransactionEvent {
AccountVaultBeforeAddAsset = ACCOUNT_VAULT_BEFORE_ADD_ASSET,
AccountVaultAfterAddAsset = ACCOUNT_VAULT_AFTER_ADD_ASSET,
AccountVaultBeforeRemoveAsset = ACCOUNT_VAULT_BEFORE_REMOVE_ASSET,
AccountVaultAfterRemoveAsset = ACCOUNT_VAULT_AFTER_REMOVE_ASSET,
AccountStorageBeforeSetItem = ACCOUNT_STORAGE_BEFORE_SET_ITEM,
AccountStorageAfterSetItem = ACCOUNT_STORAGE_AFTER_SET_ITEM,
AccountStorageBeforeSetMapItem = ACCOUNT_STORAGE_BEFORE_SET_MAP_ITEM,
AccountStorageAfterSetMapItem = ACCOUNT_STORAGE_AFTER_SET_MAP_ITEM,
AccountBeforeIncrementNonce = ACCOUNT_BEFORE_INCREMENT_NONCE,
AccountAfterIncrementNonce = ACCOUNT_AFTER_INCREMENT_NONCE,
AccountPushProcedureIndex = ACCOUNT_PUSH_PROCEDURE_INDEX,
NoteBeforeCreated = NOTE_BEFORE_CREATED,
NoteAfterCreated = NOTE_AFTER_CREATED,
NoteBeforeAddAsset = NOTE_BEFORE_ADD_ASSET,
NoteAfterAddAsset = NOTE_AFTER_ADD_ASSET,
}
impl fmt::Display for TransactionEvent {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{self:?}")
}
}
impl TryFrom<u32> for TransactionEvent {
type Error = TransactionEventParsingError;
fn try_from(value: u32) -> Result<Self, Self::Error> {
if value >> 16 != EVENT_ID_PREFIX {
return Err(TransactionEventParsingError::NotTransactionEvent(value));
}
match value {
ACCOUNT_VAULT_BEFORE_ADD_ASSET => Ok(TransactionEvent::AccountVaultBeforeAddAsset),
ACCOUNT_VAULT_AFTER_ADD_ASSET => Ok(TransactionEvent::AccountVaultAfterAddAsset),
ACCOUNT_VAULT_BEFORE_REMOVE_ASSET => {
Ok(TransactionEvent::AccountVaultBeforeRemoveAsset)
},
ACCOUNT_VAULT_AFTER_REMOVE_ASSET => Ok(TransactionEvent::AccountVaultAfterRemoveAsset),
ACCOUNT_STORAGE_BEFORE_SET_ITEM => Ok(TransactionEvent::AccountStorageBeforeSetItem),
ACCOUNT_STORAGE_AFTER_SET_ITEM => Ok(TransactionEvent::AccountStorageAfterSetItem),
ACCOUNT_STORAGE_BEFORE_SET_MAP_ITEM => {
Ok(TransactionEvent::AccountStorageBeforeSetMapItem)
},
ACCOUNT_STORAGE_AFTER_SET_MAP_ITEM => {
Ok(TransactionEvent::AccountStorageAfterSetMapItem)
},
ACCOUNT_BEFORE_INCREMENT_NONCE => Ok(TransactionEvent::AccountBeforeIncrementNonce),
ACCOUNT_AFTER_INCREMENT_NONCE => Ok(TransactionEvent::AccountAfterIncrementNonce),
ACCOUNT_PUSH_PROCEDURE_INDEX => Ok(TransactionEvent::AccountPushProcedureIndex),
NOTE_BEFORE_CREATED => Ok(TransactionEvent::NoteBeforeCreated),
NOTE_AFTER_CREATED => Ok(TransactionEvent::NoteAfterCreated),
NOTE_BEFORE_ADD_ASSET => Ok(TransactionEvent::NoteBeforeAddAsset),
NOTE_AFTER_ADD_ASSET => Ok(TransactionEvent::NoteAfterAddAsset),
_ => Err(TransactionEventParsingError::InvalidTransactionEvent(value)),
}
}
}
#[repr(u32)]
#[derive(Debug, Clone, Eq, PartialEq)]
pub enum TransactionTrace {
PrologueStart = 0x2_0000, PrologueEnd = 0x2_0001, NotesProcessingStart = 0x2_0002, NotesProcessingEnd = 0x2_0003, NoteExecutionStart = 0x2_0004, NoteExecutionEnd = 0x2_0005, TxScriptProcessingStart = 0x2_0006, TxScriptProcessingEnd = 0x2_0007, EpilogueStart = 0x2_0008, EpilogueEnd = 0x2_0009, }
impl fmt::Display for TransactionTrace {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{self:?}")
}
}
impl TryFrom<u32> for TransactionTrace {
type Error = TransactionTraceParsingError;
fn try_from(value: u32) -> Result<Self, Self::Error> {
if value >> 16 != EVENT_ID_PREFIX {
return Err(TransactionTraceParsingError::NotTransactionTrace(value));
}
match value {
0x2_0000 => Ok(TransactionTrace::PrologueStart),
0x2_0001 => Ok(TransactionTrace::PrologueEnd),
0x2_0002 => Ok(TransactionTrace::NotesProcessingStart),
0x2_0003 => Ok(TransactionTrace::NotesProcessingEnd),
0x2_0004 => Ok(TransactionTrace::NoteExecutionStart),
0x2_0005 => Ok(TransactionTrace::NoteExecutionEnd),
0x2_0006 => Ok(TransactionTrace::TxScriptProcessingStart),
0x2_0007 => Ok(TransactionTrace::TxScriptProcessingEnd),
0x2_0008 => Ok(TransactionTrace::EpilogueStart),
0x2_0009 => Ok(TransactionTrace::EpilogueEnd),
_ => Err(TransactionTraceParsingError::InvalidTransactionTrace(value)),
}
}
}