Skip to main content

o2_api_types/domain/
event.rs

1use crate::{
2    OrderId,
3    domain::{
4        book::{
5            MarketIdAssets,
6            Price,
7            Quantity,
8        },
9        trade::TradeId,
10    },
11    fuel_types::{
12        Address,
13        AssetId,
14        Bytes32,
15        ContractId,
16        TxId,
17        TxPointer,
18    },
19    parse::HexDisplayFromStr,
20    primitives::{
21        OrderType,
22        Side,
23    },
24};
25use serde_with::serde_as;
26use std::str::FromStr;
27
28/// Alias for on-chain timestamp. Represented in seconds since UNIX EPOCH.
29pub type OnChainTimeStamp = u128;
30/// Alias for timestamp when event was seen by the indexer.
31/// Represented in nanoseconds since UNIX EPOCH.
32pub type SeenTimeStamp = u128;
33
34#[serde_as]
35#[derive(
36    Clone, Copy, Debug, PartialEq, Eq, serde::Serialize, serde::Deserialize, Hash,
37)]
38pub enum Identity {
39    Address(#[serde_as(as = "HexDisplayFromStr")] Address),
40    ContractId(#[serde_as(as = "HexDisplayFromStr")] ContractId),
41}
42
43impl From<Identity> for Bytes32 {
44    fn from(value: Identity) -> Self {
45        match value {
46            Identity::Address(address) => Bytes32::new(*address),
47            Identity::ContractId(contract_id) => Bytes32::new(*contract_id),
48        }
49    }
50}
51
52impl From<Address> for Identity {
53    fn from(value: Address) -> Self {
54        Identity::Address(value)
55    }
56}
57
58impl From<ContractId> for Identity {
59    fn from(value: ContractId) -> Self {
60        Identity::ContractId(value)
61    }
62}
63
64impl FromStr for Identity {
65    type Err = serde_json::Error;
66
67    fn from_str(s: &str) -> Result<Self, Self::Err> {
68        serde_json::from_str(s)
69    }
70}
71
72impl Default for Identity {
73    fn default() -> Self {
74        Self::Address(Address::default())
75    }
76}
77
78/// Event emitted when a new order is added to the order book.
79#[derive(
80    Debug, PartialEq, Eq, serde::Serialize, serde::Deserialize, Clone, Copy, Hash,
81)]
82pub struct OrderCreatedEvent {
83    pub order_id: OrderId,
84    pub trader_id: Identity,
85    pub order_side: Side,
86    pub order_type: OrderType,
87    pub quantity: Quantity,
88    pub price: Price,
89    pub timestamp: u128,
90}
91
92/// Event emitted when two orders are matched and executed.
93#[derive(
94    Debug, PartialEq, Eq, serde::Serialize, serde::Deserialize, Clone, Copy, Hash,
95)]
96pub struct OrderMatchedEvent {
97    pub trade_id: TradeId,
98    pub quantity: Quantity,
99    pub price: Price,
100    pub timestamp: u128,
101}
102
103/// Event emitted when an order is cancelled.
104#[derive(
105    Debug, PartialEq, Eq, serde::Serialize, serde::Deserialize, Clone, Copy, Hash,
106)]
107pub struct OrderCancelledEvent {
108    pub order_id: Bytes32,
109    pub timestamp: u128,
110    pub reason: CancellationReason,
111}
112
113/// Fake event injected at the end of the contract call which created a market order.
114#[derive(
115    Debug, PartialEq, Eq, serde::Serialize, serde::Deserialize, Clone, Copy, Hash,
116)]
117pub struct EndOfMarketOrderEvent {
118    pub order_id: Bytes32,
119    pub timestamp: u128,
120}
121
122#[derive(
123    Debug, PartialEq, Eq, serde::Serialize, serde::Deserialize, Clone, Copy, Hash,
124)]
125pub enum CancellationReason {
126    ByOwner,
127    OutOfGas,
128    AmountTooSmall,
129    Internal,
130    MarketOrder,
131    ExpiredOrder,
132}
133
134/// Event emitted when a trader receives their settled balance.
135#[derive(
136    Debug, PartialEq, Eq, serde::Serialize, serde::Deserialize, Clone, Copy, Hash,
137)]
138pub struct WithdrawSettledTradeEvent {
139    pub trader_id: Identity,
140    pub base_amount: u64,
141    pub quote_amount: u64,
142}
143
144/// Event emitted at initialization that provides information about the order book.
145#[derive(
146    Debug, PartialEq, Eq, serde::Serialize, serde::Deserialize, Clone, Copy, Hash,
147)]
148pub struct OrderBookConfigEvent {
149    pub base_asset: AssetId,
150    pub quote_asset: AssetId,
151    pub base_decimals: u64,
152    pub quote_decimals: u64,
153    pub min_order: u64,
154    pub maker_fee: u64,
155    pub taker_fee: u64,
156    pub price_precision: u64,
157    pub quantity_precision: u64,
158    pub price_window: u64,
159    pub dust: u64,
160    pub allow_fractional_price: bool,
161}
162
163/// Event emitted when the base and quote symbols are set.
164#[derive(Debug, PartialEq, Eq, serde::Serialize, serde::Deserialize, Clone, Hash)]
165pub struct OrderBookSymbolsEvent {
166    pub base_symbol: String,
167    pub quote_symbol: String,
168}
169
170#[derive(Debug, PartialEq, Eq, serde::Serialize, serde::Deserialize, Clone, Hash)]
171pub struct OrderBookWhitelistEvent {
172    pub whitelist: Option<ContractId>,
173}
174
175#[derive(Debug, PartialEq, Eq, serde::Serialize, serde::Deserialize, Clone, Hash)]
176pub struct OrderBookBlacklistEvent {
177    pub blacklist: Option<ContractId>,
178}
179
180/// Event emitted when a nonce change occurs for a contract.
181#[derive(
182    Debug, PartialEq, Eq, serde::Serialize, serde::Deserialize, Clone, Copy, Hash,
183)]
184pub struct NonceChangeEvent {
185    pub nonce: u64,
186}
187
188#[derive(
189    Debug, PartialEq, Eq, serde::Serialize, serde::Deserialize, Clone, Copy, Hash,
190)]
191pub struct BlockChainEvent<Event> {
192    pub tx_pointer: TxPointer,
193    pub receipt_index: u16,
194    pub contract_id: ContractId,
195    pub tx_id: TxId,
196    pub event: Event,
197}
198
199#[derive(
200    Debug, PartialEq, Eq, serde::Serialize, serde::Deserialize, Clone, Copy, Hash,
201)]
202pub struct TradeAccountReferer {
203    pub trade_account: ContractId,
204    pub referer: Identity,
205}
206
207#[derive(
208    Debug, PartialEq, Eq, serde::Serialize, serde::Deserialize, Clone, Copy, Hash,
209)]
210pub struct BalanceIncrease {
211    pub from: Option<ContractId>,
212    pub amount: u64,
213    pub asset_id: AssetId,
214}
215
216#[derive(
217    Debug, PartialEq, Eq, serde::Serialize, serde::Deserialize, Clone, Copy, Hash,
218)]
219pub struct BalanceDecrease {
220    pub amount: u64,
221    pub asset_id: AssetId,
222    pub to: Option<ContractId>,
223}
224
225#[derive(
226    Debug, PartialEq, Eq, serde::Serialize, serde::Deserialize, Clone, Copy, Hash,
227)]
228pub struct TradeAccountRegistered {
229    pub contract_id: ContractId,
230    pub owner: Identity,
231}
232
233#[derive(
234    Debug, PartialEq, Eq, serde::Serialize, serde::Deserialize, Clone, Copy, Hash,
235)]
236pub struct OrderBookRegistered {
237    pub contract_id: ContractId,
238    pub market_id: MarketIdAssets,
239}
240
241#[derive(
242    Debug, PartialEq, Eq, serde::Serialize, serde::Deserialize, Clone, Copy, Hash,
243)]
244pub struct PauseEvent {
245    pub caller: Identity,
246}
247
248#[derive(
249    Debug, PartialEq, Eq, serde::Serialize, serde::Deserialize, Clone, Copy, Hash,
250)]
251pub struct UnpauseEvent {
252    pub caller: Identity,
253}
254
255#[derive(
256    Debug, PartialEq, Eq, serde::Serialize, serde::Deserialize, Clone, Copy, Hash,
257)]
258pub struct FeesClaimedEvent {
259    pub base_fees: u64,
260    pub quote_fees: u64,
261}
262
263#[derive(Debug, PartialEq, Eq, serde::Serialize, serde::Deserialize, Clone, Hash)]
264pub struct Session {
265    pub session_id: Identity,
266    pub expiry: u64,
267    pub contract_ids: Vec<ContractId>,
268}
269
270#[derive(Debug, PartialEq, Eq, serde::Serialize, serde::Deserialize, Clone, Hash)]
271pub struct SessionCreated {
272    pub account: Identity,
273    pub session: Session,
274}
275
276#[derive(
277    Debug, PartialEq, Eq, serde::Serialize, serde::Deserialize, Clone, Copy, Hash,
278)]
279pub struct SessionRevoked {
280    pub account: Identity,
281    pub session_id: Identity,
282}
283
284#[derive(
285    Debug, PartialEq, Eq, serde::Serialize, serde::Deserialize, Clone, Copy, Hash,
286)]
287pub struct NewTx {
288    pub tx_pointer: TxPointer,
289    pub tx_id: TxId,
290}
291
292#[derive(
293    Debug,
294    PartialEq,
295    Eq,
296    serde::Serialize,
297    serde::Deserialize,
298    Clone,
299    strum_macros::AsRefStr,
300    Hash,
301)]
302#[strum(serialize_all = "snake_case")]
303pub enum EventV1 {
304    BalanceIncrease(BlockChainEvent<BalanceIncrease>),
305    BalanceDecrease(BlockChainEvent<BalanceDecrease>),
306    OrderCreated(BlockChainEvent<OrderCreatedEvent>),
307    OrderCanceled(BlockChainEvent<OrderCancelledEvent>),
308    EndOfMarketOrder(BlockChainEvent<EndOfMarketOrderEvent>),
309    TradePerformed(BlockChainEvent<OrderMatchedEvent>),
310    Withdrawal(BlockChainEvent<WithdrawSettledTradeEvent>),
311    Configuration(BlockChainEvent<OrderBookConfigEvent>),
312    ConfigurationSymbols(BlockChainEvent<OrderBookSymbolsEvent>),
313    ConfigurationWhitelist(BlockChainEvent<OrderBookWhitelistEvent>),
314    ConfigurationBlacklist(BlockChainEvent<OrderBookBlacklistEvent>),
315    NonceChange(BlockChainEvent<NonceChangeEvent>),
316    TradeAccountRegistration(BlockChainEvent<TradeAccountRegistered>),
317    TradeAccountReferer(BlockChainEvent<TradeAccountReferer>),
318    OrderBookRegistration(BlockChainEvent<OrderBookRegistered>),
319    PauseEvent(BlockChainEvent<PauseEvent>),
320    UnpauseEvent(BlockChainEvent<UnpauseEvent>),
321    FeesClaimedEvent(BlockChainEvent<FeesClaimedEvent>),
322    SessionCreated(BlockChainEvent<SessionCreated>),
323    SessionRevoked(BlockChainEvent<SessionRevoked>),
324}
325
326#[derive(Debug, PartialEq, Eq, serde::Serialize, serde::Deserialize, Clone, Hash)]
327pub enum Event {
328    EventV1(EventV1),
329}