feat: Add state_registry.rs (#285)
This it to make it easier for users to add new protocol states #time 34m #time 0m
This commit is contained in:
@@ -3,6 +3,7 @@ mod config;
|
|||||||
mod encoding;
|
mod encoding;
|
||||||
mod execution;
|
mod execution;
|
||||||
mod rpc;
|
mod rpc;
|
||||||
|
mod state_registry;
|
||||||
mod test_runner;
|
mod test_runner;
|
||||||
mod traces;
|
mod traces;
|
||||||
mod tycho_rpc;
|
mod tycho_rpc;
|
||||||
|
|||||||
50
protocol-testing/src/state_registry.rs
Normal file
50
protocol-testing/src/state_registry.rs
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
use tycho_simulation::{
|
||||||
|
evm::{
|
||||||
|
decoder::TychoStreamDecoder,
|
||||||
|
engine_db::tycho_db::PreCachedDB,
|
||||||
|
protocol::{
|
||||||
|
ekubo::state::EkuboState, pancakeswap_v2::state::PancakeswapV2State,
|
||||||
|
uniswap_v2::state::UniswapV2State, uniswap_v3::state::UniswapV3State,
|
||||||
|
vm::state::EVMPoolState,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
protocol::models::DecoderContext,
|
||||||
|
tycho_client::feed::BlockHeader,
|
||||||
|
};
|
||||||
|
|
||||||
|
/// Register decoder based on protocol system. Defaults to EVMPoolState.
|
||||||
|
/// To add a new protocol, just add a case to the match statement.
|
||||||
|
pub fn register_decoder_for_protocol(
|
||||||
|
decoder: &mut TychoStreamDecoder<BlockHeader>,
|
||||||
|
protocol_system: &str,
|
||||||
|
decoder_context: DecoderContext,
|
||||||
|
) -> miette::Result<()> {
|
||||||
|
match protocol_system {
|
||||||
|
"uniswap_v2" | "sushiswap_v2" => {
|
||||||
|
decoder
|
||||||
|
.register_decoder_with_context::<UniswapV2State>(protocol_system, decoder_context);
|
||||||
|
}
|
||||||
|
"pancakeswap_v2" => {
|
||||||
|
decoder.register_decoder_with_context::<PancakeswapV2State>(
|
||||||
|
protocol_system,
|
||||||
|
decoder_context,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
"uniswap_v3" | "pancakeswap_v3" => {
|
||||||
|
decoder
|
||||||
|
.register_decoder_with_context::<UniswapV3State>(protocol_system, decoder_context);
|
||||||
|
}
|
||||||
|
"ekubo_v2" => {
|
||||||
|
decoder.register_decoder_with_context::<EkuboState>(protocol_system, decoder_context);
|
||||||
|
}
|
||||||
|
// Default to EVMPoolState for all other protocols
|
||||||
|
_ => {
|
||||||
|
decoder.register_decoder_with_context::<EVMPoolState<PreCachedDB>>(
|
||||||
|
protocol_system,
|
||||||
|
decoder_context,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
@@ -22,15 +22,7 @@ use postgres::{Client, Error, NoTls};
|
|||||||
use tokio::runtime::Runtime;
|
use tokio::runtime::Runtime;
|
||||||
use tracing::{debug, error, info, warn};
|
use tracing::{debug, error, info, warn};
|
||||||
use tycho_simulation::{
|
use tycho_simulation::{
|
||||||
evm::{
|
evm::{decoder::TychoStreamDecoder, protocol::u256_num::bytes_to_u256},
|
||||||
decoder::TychoStreamDecoder,
|
|
||||||
engine_db::tycho_db::PreCachedDB,
|
|
||||||
protocol::{
|
|
||||||
ekubo::state::EkuboState, pancakeswap_v2::state::PancakeswapV2State,
|
|
||||||
u256_num::bytes_to_u256, uniswap_v2::state::UniswapV2State,
|
|
||||||
uniswap_v3::state::UniswapV3State, vm::state::EVMPoolState,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
protocol::models::{DecoderContext, Update},
|
protocol::models::{DecoderContext, Update},
|
||||||
tycho_client::feed::{
|
tycho_client::feed::{
|
||||||
synchronizer::{ComponentWithState, Snapshot, StateSyncMessage},
|
synchronizer::{ComponentWithState, Snapshot, StateSyncMessage},
|
||||||
@@ -50,6 +42,7 @@ use crate::{
|
|||||||
encoding::encode_swap,
|
encoding::encode_swap,
|
||||||
execution,
|
execution,
|
||||||
rpc::RPCProvider,
|
rpc::RPCProvider,
|
||||||
|
state_registry::register_decoder_for_protocol,
|
||||||
tycho_rpc::TychoClient,
|
tycho_rpc::TychoClient,
|
||||||
tycho_runner::TychoRunner,
|
tycho_runner::TychoRunner,
|
||||||
utils::build_spkg,
|
utils::build_spkg,
|
||||||
@@ -436,36 +429,7 @@ impl TestRunner {
|
|||||||
if let Some(vm_adapter_path) = adapter_contract_path_str {
|
if let Some(vm_adapter_path) = adapter_contract_path_str {
|
||||||
decoder_context = decoder_context.vm_adapter_path(vm_adapter_path);
|
decoder_context = decoder_context.vm_adapter_path(vm_adapter_path);
|
||||||
}
|
}
|
||||||
match protocol_system {
|
register_decoder_for_protocol(&mut decoder, protocol_system, decoder_context)?;
|
||||||
"uniswap_v2" | "sushiswap_v2" => {
|
|
||||||
decoder.register_decoder_with_context::<UniswapV2State>(
|
|
||||||
protocol_system,
|
|
||||||
decoder_context,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
"pancakeswap_v2" => {
|
|
||||||
decoder.register_decoder_with_context::<PancakeswapV2State>(
|
|
||||||
protocol_system,
|
|
||||||
decoder_context,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
"uniswap_v3" | "pancakeswap_v3" => {
|
|
||||||
decoder.register_decoder_with_context::<UniswapV3State>(
|
|
||||||
protocol_system,
|
|
||||||
decoder_context,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
"ekubo_v2" => {
|
|
||||||
decoder
|
|
||||||
.register_decoder_with_context::<EkuboState>(protocol_system, decoder_context);
|
|
||||||
}
|
|
||||||
_ => {
|
|
||||||
decoder.register_decoder_with_context::<EVMPoolState<PreCachedDB>>(
|
|
||||||
protocol_system,
|
|
||||||
decoder_context,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Mock a stream message, with only a Snapshot and no deltas
|
// Mock a stream message, with only a Snapshot and no deltas
|
||||||
let mut states: HashMap<String, ComponentWithState> = HashMap::new();
|
let mut states: HashMap<String, ComponentWithState> = HashMap::new();
|
||||||
|
|||||||
Reference in New Issue
Block a user