99 lines
3.6 KiB
Rust
99 lines
3.6 KiB
Rust
use std::str::FromStr;
|
|
|
|
use ethabi::ethereum_types::Address;
|
|
use substreams::scalar::BigInt;
|
|
use substreams_ethereum::pb::eth::v2::{self as eth};
|
|
|
|
use substreams_helper::{event_handler::EventHandler, hex::Hexable};
|
|
|
|
use crate::abi::factory::events::PoolCreated;
|
|
use tycho_substreams::prelude::*;
|
|
|
|
#[substreams::handlers::map]
|
|
pub fn map_pools_created(
|
|
params: String,
|
|
block: eth::Block,
|
|
) -> Result<BlockChanges, substreams::errors::Error> {
|
|
let mut new_pools: Vec<TransactionChanges> = vec![];
|
|
let factory_address = params.as_str();
|
|
|
|
get_new_pools(&block, &mut new_pools, factory_address);
|
|
|
|
Ok(BlockChanges { block: Some((&block).into()), changes: new_pools })
|
|
}
|
|
|
|
// Extract new pools from PoolCreated events
|
|
fn get_new_pools(
|
|
block: ð::Block,
|
|
new_pools: &mut Vec<TransactionChanges>,
|
|
factory_address: &str,
|
|
) {
|
|
// Extract new pools from PoolCreated events
|
|
let mut on_pool_created = |event: PoolCreated, _tx: ð::TransactionTrace, _log: ð::Log| {
|
|
let tycho_tx: Transaction = _tx.into();
|
|
|
|
new_pools.push(TransactionChanges {
|
|
tx: Some(tycho_tx.clone()),
|
|
contract_changes: vec![],
|
|
entity_changes: vec![EntityChanges {
|
|
component_id: event.pool.to_hex(),
|
|
attributes: vec![
|
|
Attribute {
|
|
name: "liquidity".to_string(),
|
|
value: BigInt::from(0).to_signed_bytes_le(),
|
|
change: ChangeType::Creation.into(),
|
|
},
|
|
Attribute {
|
|
name: "tick".to_string(),
|
|
value: BigInt::from(0).to_signed_bytes_le(),
|
|
change: ChangeType::Creation.into(),
|
|
},
|
|
Attribute {
|
|
name: "sqrt_price_x96".to_string(),
|
|
value: BigInt::from(0).to_signed_bytes_le(),
|
|
change: ChangeType::Creation.into(),
|
|
},
|
|
],
|
|
}],
|
|
component_changes: vec![ProtocolComponent {
|
|
id: event.pool.to_hex(),
|
|
tokens: vec![event.token0, event.token1],
|
|
contracts: vec![],
|
|
static_att: vec![
|
|
Attribute {
|
|
name: "fee".to_string(),
|
|
value: event.fee.to_signed_bytes_le(),
|
|
change: ChangeType::Creation.into(),
|
|
},
|
|
Attribute {
|
|
name: "tick_spacing".to_string(),
|
|
value: event.tick_spacing.to_signed_bytes_le(),
|
|
change: ChangeType::Creation.into(),
|
|
},
|
|
Attribute {
|
|
name: "pool_address".to_string(),
|
|
value: event.pool,
|
|
change: ChangeType::Creation.into(),
|
|
},
|
|
],
|
|
change: i32::from(ChangeType::Creation),
|
|
protocol_type: Option::from(ProtocolType {
|
|
name: "uniswap_v3_pool".to_string(),
|
|
financial_type: FinancialType::Swap.into(),
|
|
attribute_schema: vec![],
|
|
implementation_type: ImplementationType::Custom.into(),
|
|
}),
|
|
tx: Some(tycho_tx),
|
|
}],
|
|
balance_changes: vec![],
|
|
})
|
|
};
|
|
|
|
let mut eh = EventHandler::new(block);
|
|
|
|
eh.filter_by_address(vec![Address::from_str(factory_address).unwrap()]);
|
|
|
|
eh.on::<PoolCreated, _>(&mut on_pool_created);
|
|
eh.handle_events();
|
|
}
|