From e87c1d53822593fc3bf53fcb005ebfe9a59be929 Mon Sep 17 00:00:00 2001 From: ts0yu <120932697+ts0yu@users.noreply.github.com> Date: Wed, 17 Jul 2024 16:05:16 +0000 Subject: [PATCH] feat: token approval for liq admin --- src/bindings/poolmanager.rs | 2 +- src/lib.rs | 10 +++-- src/liquidity_admin.rs | 74 +++++++++++++++++++++++++++++++++++++ 3 files changed, 82 insertions(+), 4 deletions(-) create mode 100644 src/liquidity_admin.rs diff --git a/src/bindings/poolmanager.rs b/src/bindings/poolmanager.rs index b6a3840..24c9682 100644 --- a/src/bindings/poolmanager.rs +++ b/src/bindings/poolmanager.rs @@ -1722,7 +1722,7 @@ pub mod PoolManager { struct ModifyLiquidityParams { int24 tickLower; int24 tickUpper; int256 liquidityDelta; bytes32 salt; } ```*/ #[allow(non_camel_case_types, non_snake_case)] - #[derive(Clone)] + #[derive(Clone, Default, Debug)] pub struct ModifyLiquidityParams { pub tickLower: as alloy::sol_types::SolType>::RustType, pub tickUpper: as alloy::sol_types::SolType>::RustType, diff --git a/src/lib.rs b/src/lib.rs index 8ee7085..056dc5f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -14,7 +14,10 @@ use crate::{ bindings::{ arenatoken::ArenaToken, liquidexchange::LiquidExchange, - poolmanager::{PoolManager, PoolManager::PoolKey}, + poolmanager::{ + PoolManager, + PoolManager::{ModifyLiquidityParams, PoolKey}, + }, }, deployer::{DeploymentRequest, DeploymentResponse}, pool_admin::PoolParams, @@ -25,6 +28,7 @@ use crate::{ pub mod arbitrageur; pub mod bindings; pub mod deployer; +pub mod liquidity_admin; pub mod pool_admin; pub mod price_changer; pub mod types; @@ -56,8 +60,8 @@ mod tests { .send( To::Agent("deployer".to_string()), DeploymentRequest::Token { - name: String::from("TEST"), - symbol: String::from("TST"), + name: String::from("TEST0"), + symbol: String::from("TST0"), decimals: 18, }, ) diff --git a/src/liquidity_admin.rs b/src/liquidity_admin.rs new file mode 100644 index 0000000..4e7d10b --- /dev/null +++ b/src/liquidity_admin.rs @@ -0,0 +1,74 @@ +use alloy::sol_types::sol_data::Int; + +use super::*; + +#[derive(Debug, Deserialize, Serialize, Clone)] +pub struct LiquidityAdmin { + #[serde(skip)] + pub messager: Option, + + #[serde(skip)] + pub client: Option>, + + pub deployment: Option
, +} + +#[derive(Deserialize, Serialize, Clone)] +pub struct AllocationRequest { + #[serde(skip)] + pool: PoolKey, + + #[serde(skip)] + modification: ModifyLiquidityParams, +} + +#[async_trait::async_trait] +impl Behavior for LiquidityAdmin { + async fn startup( + &mut self, + client: Arc, + messager: Messager, + ) -> Result>> { + self.client = Some(client.clone()); + self.messager = Some(messager.clone()); + + let mut stream = messager.clone().stream().unwrap(); + + while let Some(event) = stream.next().await { + let query: DeploymentResponse = match serde_json::from_str(&event.data) { + Ok(query) => query, + Err(_) => continue, + }; + + if let DeploymentResponse::PoolManager(address) = query { + self.deployment = Some(address); + break; + } + } + + Ok(Some(messager.clone().stream().unwrap())) + } + + async fn process(&mut self, event: Message) -> Result { + let query: AllocationRequest = match serde_json::from_str(&event.data) { + Ok(query) => query, + Err(_) => return Ok(ControlFlow::Continue), + }; + + ArenaToken::new(query.pool.currency0, self.client.clone().unwrap()) + .approve(self.deployment.unwrap(), Uint::MAX) + .send() + .await? + .watch() + .await?; + + ArenaToken::new(query.pool.currency1, self.client.clone().unwrap()) + .approve(self.deployment.unwrap(), Uint::MAX) + .send() + .await? + .watch() + .await?; + + return Ok(ControlFlow::Continue); + } +}