From 929cbcfecb5256584d637896cc7236e8cde2ba47 Mon Sep 17 00:00:00 2001 From: Sniezka Date: Mon, 11 Dec 2023 15:53:24 +0100 Subject: [PATCH 1/3] Added claim_fee entrypoint --- src/contracts/entrypoints.rs | 4 +++- src/lib.rs | 42 ++++++++++++++++++++++++++++++------ 2 files changed, 38 insertions(+), 8 deletions(-) diff --git a/src/contracts/entrypoints.rs b/src/contracts/entrypoints.rs index 88b5c83..ed91dd8 100644 --- a/src/contracts/entrypoints.rs +++ b/src/contracts/entrypoints.rs @@ -1,5 +1,5 @@ use super::{FeeTier, Pool, PoolKey, Tick}; -use crate::InvariantError; +use crate::{math::token_amount::TokenAmount, InvariantError}; use odra::{prelude::vec::Vec, types::Address}; pub trait Entrypoints { @@ -26,4 +26,6 @@ pub trait Entrypoints { fn is_tick_initialized(&self, key: PoolKey, index: i32) -> bool; fn get_tick(&self, key: PoolKey, index: i32) -> Result; + + fn claim_fee(&mut self, index: u32) -> Result<(TokenAmount, TokenAmount), InvariantError>; } diff --git a/src/lib.rs b/src/lib.rs index 92336e5..cb25723 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -12,11 +12,13 @@ use crate::math::{check_tick, percentage::Percentage, sqrt_price::SqrtPrice}; use contracts::{ FeeTier, FeeTiers, Pool, PoolKey, PoolKeys, Pools, Positions, State, Tick, Tickmap, Ticks, }; +use math::token_amount::TokenAmount; use odra::contract_env; use odra::prelude::vec::Vec; -use odra::types::Address; +use odra::types::{Address, U256}; use odra::{OdraType, UnwrapOrRevert, Variable}; - +use odra_modules::erc20::Erc20Ref; +use decimal::*; #[derive(OdraType, Debug, PartialEq)] pub enum InvariantError { NotAdmin, @@ -52,10 +54,10 @@ pub struct SwapResult { #[odra::module] pub struct Invariant { - _positions: Positions, + positions: Positions, pools: Pools, - _tickmap: Tickmap, - _ticks: Ticks, + tickmap: Tickmap, + ticks: Ticks, fee_tiers: Variable, pool_keys: Variable, state: Variable, @@ -166,10 +168,36 @@ impl Entrypoints for Invariant { } pub fn is_tick_initialized(&self, key: PoolKey, index: i32) -> bool { - self._tickmap.get(index, key.fee_tier.tick_spacing, key) + self.tickmap.get(index, key.fee_tier.tick_spacing, key) } pub fn get_tick(&self, key: PoolKey, index: i32) -> Result { - self._ticks.get(key, index) + self.ticks.get(key, index) + } + + pub fn claim_fee(&mut self, index: u32) -> Result<(TokenAmount, TokenAmount), InvariantError> { + let caller = odra::contract_env::caller(); + let current_timestamp = odra::contract_env::get_block_time(); + let mut position = self.positions.get(caller,index)?; + let mut lower_tick = self.ticks.get(position.pool_key, position.lower_tick_index)?; + let mut upper_tick = self.ticks.get(position.pool_key, position.upper_tick_index)?; + let mut pool = self.pools.get(position.pool_key)?; + + let (x,y) = position.claim_fee(&mut pool, &mut upper_tick, &mut lower_tick, current_timestamp); + + self.positions.update(caller, index, &position)?; + self.pools.update(position.pool_key, &pool)?; + self.ticks.update(position.pool_key, position.lower_tick_index, &lower_tick)?; + self.ticks.update(position.pool_key, position.upper_tick_index, &upper_tick)?; + + if x.get() > U256::from(0) { + Erc20Ref::at(&position.pool_key.token_x).transfer(&caller, &x.get()); + } + + if y.get() > U256::from(0) { + Erc20Ref::at(&position.pool_key.token_y).transfer(&caller, &y.get()); + } + + Ok((x,y)) } } From ad1d776f0c6f1fdd8bf82196a4f0fd95cc1510ec Mon Sep 17 00:00:00 2001 From: Sniezka Date: Mon, 11 Dec 2023 16:17:10 +0100 Subject: [PATCH 2/3] Fixed clippy --- resources/invariant_schema.json | 21 +++++++++++++++++++++ src/lib.rs | 27 +++++++++++++++++++-------- 2 files changed, 40 insertions(+), 8 deletions(-) diff --git a/resources/invariant_schema.json b/resources/invariant_schema.json index 3a7fb68..f1e2179 100644 --- a/resources/invariant_schema.json +++ b/resources/invariant_schema.json @@ -157,6 +157,27 @@ "err": "U32" } } + }, + { + "name": "claim_fee", + "is_mutable": true, + "args": [ + { + "name": "index", + "ty": "U32" + } + ], + "return_ty": { + "Result": { + "ok": { + "Tuple2": [ + "Any", + "Any" + ] + }, + "err": "U32" + } + } } ], "events": [] diff --git a/src/lib.rs b/src/lib.rs index cb25723..df15ada 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -12,13 +12,13 @@ use crate::math::{check_tick, percentage::Percentage, sqrt_price::SqrtPrice}; use contracts::{ FeeTier, FeeTiers, Pool, PoolKey, PoolKeys, Pools, Positions, State, Tick, Tickmap, Ticks, }; +use decimal::*; use math::token_amount::TokenAmount; use odra::contract_env; use odra::prelude::vec::Vec; use odra::types::{Address, U256}; use odra::{OdraType, UnwrapOrRevert, Variable}; use odra_modules::erc20::Erc20Ref; -use decimal::*; #[derive(OdraType, Debug, PartialEq)] pub enum InvariantError { NotAdmin, @@ -178,17 +178,28 @@ impl Entrypoints for Invariant { pub fn claim_fee(&mut self, index: u32) -> Result<(TokenAmount, TokenAmount), InvariantError> { let caller = odra::contract_env::caller(); let current_timestamp = odra::contract_env::get_block_time(); - let mut position = self.positions.get(caller,index)?; - let mut lower_tick = self.ticks.get(position.pool_key, position.lower_tick_index)?; - let mut upper_tick = self.ticks.get(position.pool_key, position.upper_tick_index)?; + let mut position = self.positions.get(caller, index)?; + let mut lower_tick = self + .ticks + .get(position.pool_key, position.lower_tick_index)?; + let mut upper_tick = self + .ticks + .get(position.pool_key, position.upper_tick_index)?; let mut pool = self.pools.get(position.pool_key)?; - let (x,y) = position.claim_fee(&mut pool, &mut upper_tick, &mut lower_tick, current_timestamp); + let (x, y) = position.claim_fee( + &mut pool, + &mut upper_tick, + &mut lower_tick, + current_timestamp, + ); self.positions.update(caller, index, &position)?; self.pools.update(position.pool_key, &pool)?; - self.ticks.update(position.pool_key, position.lower_tick_index, &lower_tick)?; - self.ticks.update(position.pool_key, position.upper_tick_index, &upper_tick)?; + self.ticks + .update(position.pool_key, position.lower_tick_index, &lower_tick)?; + self.ticks + .update(position.pool_key, position.upper_tick_index, &upper_tick)?; if x.get() > U256::from(0) { Erc20Ref::at(&position.pool_key.token_x).transfer(&caller, &x.get()); @@ -198,6 +209,6 @@ impl Entrypoints for Invariant { Erc20Ref::at(&position.pool_key.token_y).transfer(&caller, &y.get()); } - Ok((x,y)) + Ok((x, y)) } } From ef89e10c01ede0b484e94e694bc6ef0f8652ead6 Mon Sep 17 00:00:00 2001 From: Sniezka Date: Tue, 12 Dec 2023 09:04:34 +0100 Subject: [PATCH 3/3] Added is zero check --- src/lib.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 185a53f..2d09ece 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -301,11 +301,11 @@ impl Entrypoints for Invariant { self.ticks .update(position.pool_key, position.upper_tick_index, &upper_tick)?; - if x.get() > U256::from(0) { + if x.get().is_zero() { Erc20Ref::at(&position.pool_key.token_x).transfer(&caller, &x.get()); } - if y.get() > U256::from(0) { + if y.get().is_zero() { Erc20Ref::at(&position.pool_key.token_y).transfer(&caller, &y.get()); }