nautilus_blockchain/exchanges/arbitrum/
fluid.rs1use std::sync::LazyLock;
17
18use nautilus_model::defi::{
19 PoolIdentifier,
20 chain::chains,
21 dex::{AmmType, Dex, DexType},
22};
23use ustr::Ustr;
24
25use crate::{
26 events::pool_created::PoolCreatedEvent,
27 exchanges::extended::DexExtended,
28 hypersync::{
29 HypersyncLog,
30 log::{extract_address_from_topic, extract_block_number, validate_event_signature_hash},
31 },
32};
33
34const POOL_CREATED_EVENT_SIGNATURE_HASH: &str =
35 "3fecd5f7aca6136a20a999e7d11ff5dcea4bd675cb125f93ccd7d53f98ec57e4";
36
37pub static FLUID_DEX: LazyLock<DexExtended> = LazyLock::new(|| {
39 let mut dex = DexExtended::new(Dex::new(
40 chains::ARBITRUM.clone(),
41 DexType::FluidDEX,
42 "0x91716C4EDA1Fb55e84Bf8b4c7085f84285c19085",
43 269528370,
44 AmmType::CLAMM,
45 "DexT1Deployed(address,uint256,address,address)",
46 "",
47 "",
48 "",
49 "",
50 ));
51 dex.set_pool_created_event_hypersync_parsing(parse_fluid_dex_pool_created_event_hypersync);
52 dex
53});
54
55#[expect(clippy::needless_pass_by_value)] fn parse_fluid_dex_pool_created_event_hypersync(
57 log: HypersyncLog,
58) -> anyhow::Result<PoolCreatedEvent> {
59 validate_event_signature_hash("DexT1Deployed", POOL_CREATED_EVENT_SIGNATURE_HASH, &log)?;
60
61 let block_number = extract_block_number(&log)?;
62 let pool_address = extract_address_from_topic(&log, 1, "pool")?;
63 let pool_identifier = PoolIdentifier::Address(Ustr::from(&pool_address.to_string()));
64 let supply_token_address = extract_address_from_topic(&log, 2, "supply_token")?;
65 let borrow_token_address = extract_address_from_topic(&log, 3, "borrow_token")?;
66
67 Ok(PoolCreatedEvent::new(
68 block_number,
69 supply_token_address,
70 borrow_token_address,
71 pool_address,
72 pool_identifier,
73 None,
74 None,
75 ))
76}