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
28pub type OnChainTimeStamp = u128;
30pub 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#[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#[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#[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#[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#[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#[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#[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#[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}