Files
tycho-protocol-sdk/substreams/ethereum-uniswap-v4/src/modules/5_map_store_ticks.rs
Louise Poole f13c1c263b refactor(uniswap_v4): remove costly clone calls (#169)
* Removed costly `TransactionTrace` clones calls and `.clone()` at a few other places

* style: formatting

* chore: bump uniswap v4 versions to 0.2.1

* fix: fix double referencing

---------

Co-authored-by: Matthieu Vachon <matt@streamingfast.io>
2025-03-04 14:51:13 +00:00

74 lines
2.5 KiB
Rust

use std::str::FromStr;
use substreams::store::StoreAddBigInt;
use crate::pb::uniswap::v4::{
events::{pool_event, PoolEvent},
Events, TickDelta, TickDeltas,
};
use substreams::{
scalar::BigInt,
store::{StoreAdd, StoreNew},
};
use anyhow::Ok;
use substreams_helper::hex::Hexable;
#[substreams::handlers::map]
pub fn map_ticks_changes(events: Events) -> Result<TickDeltas, anyhow::Error> {
let ticks_deltas = events
.pool_events
.into_iter()
.flat_map(event_to_ticks_deltas)
.collect();
Ok(TickDeltas { deltas: ticks_deltas })
}
#[substreams::handlers::store]
pub fn store_ticks_liquidity(ticks_deltas: TickDeltas, store: StoreAddBigInt) {
let mut deltas = ticks_deltas.deltas;
deltas.sort_unstable_by_key(|delta| delta.ordinal);
deltas.iter().for_each(|delta| {
store.add(
delta.ordinal,
format!("pool:{0}:tick:{1}", &delta.pool_address.to_hex(), delta.tick_index,),
BigInt::from_signed_bytes_be(&delta.liquidity_net_delta),
);
});
}
fn event_to_ticks_deltas(event: PoolEvent) -> Vec<TickDelta> {
// On UniswapV4, the only event that changes liquidity is ModifyLiquidity. Liquidity Delta is
// now expressed as a signed int256. A positive number indicates a mint, while a negative
// indicates a burn.
// Mint events will have negative deltas for the upper tick and positive deltas for the lower.
// Burn events will have positive deltas for the upper tick and negative deltas for the lower.
match event.r#type.as_ref().unwrap() {
pool_event::Type::ModifyLiquidity(liq_change) => {
let amount =
BigInt::from_str(&liq_change.liquidity_delta).expect("Failed to parse BigInt");
vec![
TickDelta {
pool_address: hex::decode(event.pool_id.trim_start_matches("0x")).unwrap(),
tick_index: liq_change.tick_lower,
liquidity_net_delta: amount.to_signed_bytes_be(),
ordinal: event.log_ordinal,
transaction: event.transaction.clone(),
},
TickDelta {
pool_address: hex::decode(event.pool_id.trim_start_matches("0x")).unwrap(),
tick_index: liq_change.tick_upper,
liquidity_net_delta: amount.neg().to_signed_bytes_be(),
ordinal: event.log_ordinal,
transaction: event.transaction,
},
]
}
_ => vec![],
}
}