Skip to content

Commit

Permalink
feat: remove observation logic and circular buffer
Browse files Browse the repository at this point in the history
  • Loading branch information
epanchee committed Dec 12, 2024
1 parent bd5bd31 commit 9e78b65
Show file tree
Hide file tree
Showing 28 changed files with 35 additions and 1,742 deletions.
19 changes: 3 additions & 16 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 0 additions & 1 deletion contracts/pair_concentrated/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@ sei = ["astroport/sei", "astroport-pcl-common/sei"]

[dependencies]
astroport.workspace = true
astroport-circular-buffer = { path = "../../packages/circular_buffer", version = "0.2" }
astroport-pcl-common = { path = "../../packages/astroport_pcl_common", version = "2.1" }
cw2.workspace = true
cw20 = "1.1"
Expand Down
25 changes: 2 additions & 23 deletions contracts/pair_concentrated/src/contract.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@ use astroport::asset::{
};
use astroport::common::{claim_ownership, drop_ownership_proposal, propose_new_owner, LP_SUBDENOM};
use astroport::cosmwasm_ext::{DecimalToInteger, IntegerToDecimal};
use astroport::observation::{PrecommitObservation, OBSERVATIONS_SIZE};
use astroport::pair::{
Cw20HookMsg, ExecuteMsg, FeeShareConfig, InstantiateMsg, ReplyIds, MAX_FEE_SHARE_BPS,
MIN_TRADE_SIZE,
Expand All @@ -35,7 +34,6 @@ use astroport::token_factory::{
tf_before_send_hook_msg, tf_burn_msg, tf_create_denom_msg, MsgCreateDenomResponse,
};
use astroport::tokenfactory_tracker;
use astroport_circular_buffer::BufferManager;
use astroport_pcl_common::state::{
AmpGamma, Config, PoolParams, PoolState, Precisions, PriceState,
};
Expand All @@ -46,10 +44,8 @@ use astroport_pcl_common::utils::{
use astroport_pcl_common::{calc_d, get_xcp};

use crate::error::ContractError;
use crate::state::{BALANCES, CONFIG, OBSERVATIONS, OWNERSHIP_PROPOSAL};
use crate::utils::{
accumulate_swap_sizes, calculate_shares, get_assets_with_precision, query_pools,
};
use crate::state::{BALANCES, CONFIG, OWNERSHIP_PROPOSAL};
use crate::utils::{calculate_shares, get_assets_with_precision, query_pools};

/// Contract name that is used for migration.
const CONTRACT_NAME: &str = env!("CARGO_PKG_NAME");
Expand Down Expand Up @@ -152,8 +148,6 @@ pub fn instantiate(

CONFIG.save(deps.storage, &config)?;

BufferManager::init(deps.storage, OBSERVATIONS, OBSERVATIONS_SIZE)?;

// Create LP token
let sub_msg = SubMsg::reply_on_success(
tf_create_denom_msg(env.contract.address.to_string(), LP_SUBDENOM),
Expand Down Expand Up @@ -772,21 +766,6 @@ fn swap(

accumulate_prices(&env, &mut config, old_real_price);

// Store observation from precommit data
accumulate_swap_sizes(deps.storage, &env)?;

// Store time series data in precommit observation.
// Skipping small unsafe values which can seriously mess oracle price due to rounding errors.
// This data will be reflected in observations in the next action.
if offer_asset_dec.amount >= MIN_TRADE_SIZE && swap_result.dy >= MIN_TRADE_SIZE {
let (base_amount, quote_amount) = if offer_ind == 0 {
(offer_asset.amount, return_amount)
} else {
(return_amount, offer_asset.amount)
};
PrecommitObservation::save(deps.storage, &env, base_amount, quote_amount)?;
}

CONFIG.save(deps.storage, &config)?;

if config.track_asset_balances {
Expand Down
7 changes: 1 addition & 6 deletions contracts/pair_concentrated/src/error.rs
Original file line number Diff line number Diff line change
@@ -1,10 +1,8 @@
use cosmwasm_std::{ConversionOverflowError, OverflowError, StdError, Uint128};
use thiserror::Error;

use cw_utils::{ParseReplyError, PaymentError};
use thiserror::Error;

use astroport::{asset::MINIMUM_LIQUIDITY_AMOUNT, pair::MAX_FEE_SHARE_BPS};
use astroport_circular_buffer::error::BufferError;
use astroport_pcl_common::error::PclError;

/// This enum describes pair contract errors
Expand All @@ -22,9 +20,6 @@ pub enum ContractError {
#[error("{0}")]
OverflowError(#[from] OverflowError),

#[error("{0}")]
CircularBuffer(#[from] BufferError),

#[error("{0}")]
PaymentError(#[from] PaymentError),

Expand Down
168 changes: 1 addition & 167 deletions contracts/pair_concentrated/src/queries.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ use itertools::Itertools;

use astroport::asset::{Asset, AssetInfo};
use astroport::cosmwasm_ext::{DecimalToInteger, IntegerToDecimal};
use astroport::observation::query_observation;
use astroport::pair::{
ConfigResponse, CumulativePricesResponse, PoolResponse, ReverseSimulationResponse,
SimulationResponse,
Expand All @@ -23,7 +22,7 @@ use astroport_pcl_common::{calc_d, get_xcp};

use crate::contract::LP_TOKEN_PRECISION;
use crate::error::ContractError;
use crate::state::{BALANCES, CONFIG, OBSERVATIONS};
use crate::state::{BALANCES, CONFIG};
use crate::utils::{calculate_shares, get_assets_with_precision, pool_info, query_pools};

/// Exposes all the queries available in the contract.
Expand Down Expand Up @@ -69,9 +68,6 @@ pub fn query(deps: Deps, env: Env, msg: QueryMsg) -> StdResult<Binary> {
&query_cumulative_prices(deps, env)
.map_err(|err| StdError::generic_err(format!("{err}")))?,
),
QueryMsg::Observe { seconds_ago } => {
to_json_binary(&query_observation(deps, env, OBSERVATIONS, seconds_ago)?)
}
QueryMsg::Config {} => to_json_binary(&query_config(deps, env)?),
QueryMsg::LpPrice {} => to_json_binary(&query_lp_price(deps, env)?),
QueryMsg::ComputeD {} => to_json_binary(&query_compute_d(deps, env)?),
Expand Down Expand Up @@ -373,165 +369,3 @@ pub fn query_simulate_provide(

Ok(share_uint128)
}

#[cfg(test)]
mod testing {

use astroport::observation::{query_observation, Observation, OracleObservation};
use astroport_circular_buffer::BufferManager;
use astroport_test::convert::f64_to_dec;
use cosmwasm_std::testing::{mock_dependencies, mock_env};
use cosmwasm_std::Timestamp;

use super::*;

#[test]
fn observations_full_buffer() {
let mut deps = mock_dependencies();
let mut env = mock_env();
env.block.time = Timestamp::from_seconds(100_000);
BufferManager::init(&mut deps.storage, OBSERVATIONS, 20).unwrap();

let mut buffer = BufferManager::new(&deps.storage, OBSERVATIONS).unwrap();

let err = query_observation(deps.as_ref(), env.clone(), OBSERVATIONS, 11000).unwrap_err();
assert_eq!(err.to_string(), "Generic error: Buffer is empty");

let array = (1..=30)
.into_iter()
.map(|i| Observation {
ts: env.block.time.seconds() + i * 1000,
price_sma: Decimal::from_ratio(i, i * i),
price: Default::default(),
})
.collect_vec();
buffer.push_many(&array);
buffer.commit(&mut deps.storage).unwrap();

env.block.time = env.block.time.plus_seconds(30_000);

assert_eq!(
OracleObservation {
timestamp: 120_000,
price: f64_to_dec(20.0 / 400.0),
},
query_observation(deps.as_ref(), env.clone(), OBSERVATIONS, 10000).unwrap()
);

assert_eq!(
OracleObservation {
timestamp: 124_411,
price: f64_to_dec(0.04098166666666694),
},
query_observation(deps.as_ref(), env.clone(), OBSERVATIONS, 5589).unwrap()
);

let err = query_observation(deps.as_ref(), env, OBSERVATIONS, 35_000).unwrap_err();
assert_eq!(
err.to_string(),
"Generic error: Requested observation is too old. Last known observation is at 111000"
);
}

#[test]
fn observations_incomplete_buffer() {
let mut deps = mock_dependencies();
let mut env = mock_env();
env.block.time = Timestamp::from_seconds(100_000);
BufferManager::init(&mut deps.storage, OBSERVATIONS, 3000).unwrap();

let mut buffer = BufferManager::new(&deps.storage, OBSERVATIONS).unwrap();

let err = query_observation(deps.as_ref(), env.clone(), OBSERVATIONS, 11000).unwrap_err();
assert_eq!(err.to_string(), "Generic error: Buffer is empty");

let array = (1..=30)
.into_iter()
.map(|i| Observation {
ts: env.block.time.seconds() + i * 1000,
price: Default::default(),
price_sma: Decimal::from_ratio(i, i * i),
})
.collect_vec();
buffer.push_many(&array);
buffer.commit(&mut deps.storage).unwrap();

env.block.time = env.block.time.plus_seconds(30_000);

assert_eq!(
OracleObservation {
timestamp: 120_000,
price: f64_to_dec(20.0 / 400.0),
},
query_observation(deps.as_ref(), env.clone(), OBSERVATIONS, 10000).unwrap()
);

assert_eq!(
OracleObservation {
timestamp: 124_411,
price: f64_to_dec(0.04098166666666694),
},
query_observation(deps.as_ref(), env.clone(), OBSERVATIONS, 5589).unwrap()
);
}

#[test]
fn observations_checking_triple_capacity_step_by_step() {
let mut deps = mock_dependencies();
let mut env = mock_env();
env.block.time = Timestamp::from_seconds(100_000);
const CAPACITY: u32 = 20;
BufferManager::init(&mut deps.storage, OBSERVATIONS, CAPACITY).unwrap();

let mut buffer = BufferManager::new(&deps.storage, OBSERVATIONS).unwrap();

let ts = env.block.time.seconds();

let array = (1..=CAPACITY * 3)
.into_iter()
.map(|i| Observation {
ts: ts + i as u64 * 1000,
price: Default::default(),
price_sma: Decimal::from_ratio(i * i, i),
})
.collect_vec();

for (k, obs) in array.iter().enumerate() {
env.block.time = env.block.time.plus_seconds(1000);

buffer.push(&obs);
buffer.commit(&mut deps.storage).unwrap();
let k1 = k as u32 + 1;

let from = k1.saturating_sub(CAPACITY) + 1;
let to = k1;

for i in from..=to {
let shift = (to - i) as u64;
if shift != 0 {
assert_eq!(
OracleObservation {
timestamp: ts + i as u64 * 1000 + 500,
price: f64_to_dec(i as f64 + 0.5),
},
query_observation(
deps.as_ref(),
env.clone(),
OBSERVATIONS,
shift * 1000 - 500
)
.unwrap()
);
}
assert_eq!(
OracleObservation {
timestamp: ts + i as u64 * 1000,
price: f64_to_dec(i as f64),
},
query_observation(deps.as_ref(), env.clone(), OBSERVATIONS, shift * 1000)
.unwrap()
);
}
}
}
}
6 changes: 0 additions & 6 deletions contracts/pair_concentrated/src/state.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,6 @@ use cw_storage_plus::{Item, SnapshotMap};

use astroport::asset::AssetInfo;
use astroport::common::OwnershipProposal;
use astroport::observation::Observation;
use astroport_circular_buffer::CircularBuffer;
use astroport_pcl_common::state::Config;

/// Stores pool parameters and state.
Expand All @@ -13,10 +11,6 @@ pub const CONFIG: Item<Config> = Item::new("config");
/// Stores the latest contract ownership transfer proposal
pub const OWNERSHIP_PROPOSAL: Item<OwnershipProposal> = Item::new("ownership_proposal");

/// Circular buffer to store trade size observations
pub const OBSERVATIONS: CircularBuffer<Observation> =
CircularBuffer::new("observations_state", "observations_buffer");

/// Stores asset balances to query them later at any block height
pub const BALANCES: SnapshotMap<&AssetInfo, Uint128> = SnapshotMap::new(
"balances",
Expand Down
Loading

0 comments on commit 9e78b65

Please sign in to comment.