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    AddedStopOrderTicketCollateral<Otw>,
61    AllocatedCollateral,
62    CanceledOrder,
63    CreatedAccount<Otw>,
64    CreatedClearingHouse,
65    CreatedMarginRatiosProposal,
66    CreatedOrderbook,
67    CreatedPosition,
68    CreatedPositionFeesProposal,
69    CreatedStopOrderTicket<Otw>,
70    CreatedSubAccount,
71    DeallocatedCollateral,
72    DeletedMarginRatiosProposal,
73    DeletedPositionFeesProposal,
74    DeletedStopOrderTicket<Otw>,
75    DeletedSubAccount,
76    DepositedCollateral<Otw>,
77    DonatedToInsuranceFund,
78    EditedStopOrderTicketDetails<Otw>,
79    EditedStopOrderTicketExecutor<Otw>,
80    ExecutedStopOrderTicket<Otw>,
81    FilledMakerOrder,
82    FilledMakerOrders,
83    FilledTakerOrder,
84    LiquidatedPosition,
85    OrderbookPostReceipt,
86    PerfomedLiquidation,
87    ReceivedCollateral<Otw>,
88    RegisteredCollateralInfo<Otw>,
89    RegisteredMarketInfo<Otw>,
90    RejectedPositionFeesProposal,
91    RemovedRegisteredMarketInfo<Otw>,
92    RemovedStopOrderTicketCollateral<Otw>,
93    ResettedPositionFees,
94    SetSubAccountUser,
95    SettledFunding,
96    TransferredDeallocatedCollateral<Otw>,
97    UpdatedBaseOracleTolerance,
98    UpdatedClearingHouseVersion,
99    UpdatedCollateralOracleTolerance,
100    UpdatedCumFundings,
101    UpdatedFees,
102    UpdatedFunding,
103    UpdatedFundingParameters,
104    UpdatedLiquidationTolerance,
105    UpdatedMarginRatios,
106    UpdatedMaxOpenInterest,
107    UpdatedMaxOpenInterestPositionParams,
108    UpdatedMaxPendingOrders,
109    UpdatedMinOrderUsdValue,
110    UpdatedOpenInterestAndFeesAccrued,
111    UpdatedPremiumTwap,
112    UpdatedSpreadTwap,
113    UpdatedSpreadTwapParameters,
114    UpdatedStopOrderMistCost,
115    WithdrewCollateral<Otw>,
116    WithdrewFees,
117    WithdrewInsuranceFund,
118});