af_iperps/
event_instance.rs

1use af_move_type::otw::Otw;
2use af_move_type::{FromRawStructError, MoveInstance};
3use af_sui_types::StructTag;
4use derive_more::{Display, From, IsVariant, TryInto};
5
6#[derive(thiserror::Error, Debug)]
7pub enum FromRawEventError {
8    #[error(transparent)]
9    FromRawStruct(#[from] FromRawStructError),
10    #[error("Not a Perpetuals event name: {0}")]
11    Name(String),
12}
13
14/// Creates an `$Enum` enum with each `$variant` containing a [`MoveInstance<T>`] where `T` is a
15/// type in [`events`](crate::events).
16macro_rules! event_instance {
17    ($Enum:ident {
18        $($variant:ident$(<$($T:ident),+>)?),+ $(,)?
19    }) => {
20        /// A Perpetuals event instance of any kind.
21        // WARN: do not add serde to the below. Since the enum has to remain sorted, adding a
22        // variant may change the 'index' of the others, and some serialization formats (e.g., BCS)
23        // use the variants' indices; so backwards compatibility could be broken.
24        #[remain::sorted]
25        #[derive(Clone, Debug, Display, From, IsVariant, TryInto)]
26        #[non_exhaustive]
27        pub enum $Enum {
28            $(
29                $variant(MoveInstance<crate::events::$variant$(<$($T),+>)?>)
30            ),+
31        }
32
33        impl $Enum {
34            pub fn new(type_: StructTag, bcs: impl AsRef<[u8]>) -> Result<Self, FromRawEventError> {
35                let name = type_.name.to_string();
36                let name_str = name.as_str();
37                Ok(match name_str {
38                    $(
39                        stringify!($variant) => Self::$variant(MoveInstance::from_raw_struct(
40                            type_, bcs.as_ref()
41                        )?),
42                    )+
43                    name => return Err(FromRawEventError::Name(name.to_owned())),
44                })
45            }
46
47            pub fn struct_tag(&self) -> StructTag {
48                match self {
49                    $(
50                        Self::$variant(inner) => inner.type_.clone().into(),
51                    )+
52                }
53            }
54        }
55    };
56}
57
58event_instance!(EventInstance {
59    AcceptedPositionFeesProposal,
60    AddedIntegratorConfig<Otw>,
61    AllocatedCollateral,
62    CanceledOrder,
63    CreatedAccount<Otw>,
64    CreatedClearingHouse,
65    CreatedMarginRatiosProposal,
66    CreatedOrderbook,
67    CreatedPosition,
68    CreatedPositionFeesProposal,
69    CreatedStopOrderTicket<Otw>,
70    DeallocatedCollateral,
71    DeletedMarginRatiosProposal,
72    DeletedPositionFeesProposal,
73    DeletedStopOrderTicket<Otw>,
74    DepositedCollateral<Otw>,
75    DonatedToInsuranceFund,
76    EditedStopOrderTicketDetails<Otw>,
77    EditedStopOrderTicketExecutors<Otw>,
78    ExecutedStopOrderTicket<Otw>,
79    FilledMakerOrder,
80    FilledMakerOrders,
81    FilledTakerOrder,
82    LiquidatedPosition,
83    PaidIntegratorFees<Otw>,
84    PerformedLiquidation,
85    PostedOrder,
86    RegisteredCollateralInfo<Otw>,
87    RegisteredMarketInfo<Otw>,
88    RejectedPositionFeesProposal,
89    RemovedIntegratorConfig<Otw>,
90    RemovedRegisteredMarketInfo<Otw>,
91    ResettedPositionFees,
92    SetPositionInitialMarginRatio,
93    SettledFunding,
94    UpdatedBaseOracleTolerance,
95    UpdatedClearingHouseVersion,
96    UpdatedCollateralOracleTolerance,
97    UpdatedCumFundings,
98    UpdatedFees,
99    UpdatedFunding,
100    UpdatedFundingParameters,
101    UpdatedGasPriceTwap,
102    UpdatedMarginRatios,
103    UpdatedMaxOpenInterest,
104    UpdatedMaxOpenInterestPositionParams,
105    UpdatedMaxPendingOrders,
106    UpdatedMinOrderUsdValue,
107    UpdatedOpenInterestAndFeesAccrued,
108    UpdatedPremiumTwap,
109    UpdatedSpreadTwap,
110    UpdatedSpreadTwapParameters,
111    UpdatedStopOrderMistCost,
112    WithdrewCollateral<Otw>,
113    WithdrewFees,
114    WithdrewInsuranceFund,
115});