Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

program: improving estimate_best_bid_ask_price #985

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 3 additions & 16 deletions programs/drift/src/controller/amm/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -825,26 +825,13 @@ fn update_pool_balances_revenue_to_fee_test() {
assert_eq!(spot_market.insurance_fund.revenue_settle_period, 0);

spot_market.insurance_fund.revenue_settle_period = 0;
let res = settle_revenue_to_insurance_fund(
0,
0,
&mut spot_market,
now + 3600,
true,
)
.unwrap();
let res = settle_revenue_to_insurance_fund(0, 0, &mut spot_market, now + 3600, true).unwrap();
assert_eq!(res, 0);
spot_market.insurance_fund.revenue_settle_period = 1;

spot_market.revenue_pool.scaled_balance = 0;
let res = settle_revenue_to_insurance_fund(
200000000,
0,
&mut spot_market,
now + 1,
false,
)
.unwrap();
let res =
settle_revenue_to_insurance_fund(200000000, 0, &mut spot_market, now + 1, false).unwrap();
assert_eq!(res, 0);
spot_market.revenue_pool.scaled_balance = 100 * SPOT_BALANCE_PRECISION;
now += 2;
Expand Down
231 changes: 230 additions & 1 deletion programs/drift/src/controller/position/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@ use crate::controller::lp::{apply_lp_rebase_to_perp_market, settle_lp_position};
use crate::controller::position::{
update_lp_market_position, update_position_and_market, PositionDelta, PositionDirection,
};
use crate::math::amm::estimate_best_bid_ask_price;
use crate::math::amm::{estimate_best_bid_ask_price, update_mark_twap_from_estimates};
use crate::state::order_params::OrderParams;

use crate::controller::repeg::_update_amm;
use crate::math::constants::{
Expand Down Expand Up @@ -294,6 +295,234 @@ fn est_bid_ask_amm() {
assert_eq!(ask, amm_bid_price);
}

#[test]
fn est_bid_ask_amm_mark_update_iterative() {
let perp_market_str = String::from("Ct8MLGv1N/dvAH3EF67yBqaUQerctpm4yqpK+QNSrXCQz76p+B+ka+8Ni2/aLOukHaFdQJXR2jkqDS+O0MbHvA9M+sjCgLVtPCXfCgAAAAAAAAAAAAAAAAUAAAAAAAAA4lbgCgAAAAD0ft4KAAAAANR4BGYAAAAACM8a0Hn//////////////1VDX2z9//////////////9QNResjr4LAAAAAAAAAAAAAAAAAAAAAABf+eFCkQUIAAAAAAAAAAAASGcYpdjVHAAAAAAAAAAAAJxiDwAAAAAAAAAAAAAAAACYFslxyfcHAAAAAAAAAAAAadwD2bgZCAAAAAAAAAAAACbmgal4NQ8AAAAAAAAAAABjPwYDAAAAAAAAAAAAAAAA84sXlajKHAAAAAAAAAAAAACRroLmLAIAAAAAAAAAAAAAJPP0h9f9////////////k+Op9x0DAAAAAAAAAAAAAG3R939QAQAAAAAAAAAAAAAAwFdzpXwCAAAAAAAAAAAAi0tQM5z//////////////7p9hfTAof/////////////iOtCPDFsAAAAAAAAAAAAAbOli63Kg/////////////2ZM0THnXAAAAAAAAAAAAABZuEr7un8BAAAAAAAAAAAA8i0bAgAAAADyLRsCAAAAAPItGwIAAAAAwKkWAQAAAADfxlwoCQYAAAAAAAAAAAAAsOH+aAICAAAAAAAAAAAAAN1CB2sXBAAAAAAAAAAAAABorLVKwAQAAAAAAAAAAAAAqigkm1kBAAAAAAAAAAAAAJKzRoiyAAAAAAAAAAAAAABK712SBQAAAAAAAAAAAAAAz5MThgUAAAAAAAAAAAAAAMG4+QwBAAAAAAAAAAAAAADz2LYf7fsHAAAAAAAAAAAAj6aNkqr4HAAAAAAAAAAAAALArDkjCAgAAAAAAAAAAACiuz90nswcAAAAAAAAAAAAPCXfCgAAAAAAAAAAAAAAAHpH5goAAAAA78vyCgAAAAC0iewKAAAAAHNN6QoAAAAAdLxODwAAAAAaBQAAAAAAAEv9vuf+////tmwEZgAAAAAQDgAAAAAAAADh9QUAAAAAZAAAAAAAAAAA4fUFAAAAAAAAAAAAAAAA4HqmTJlEAAAB+L898gAAAO2EvujZAAAAzngEZgAAAABYYgYAAAAAAKYxAQAAAAAAzngEZgAAAADECQAAqGEAAL0kAADECQAAJAAAAAAAAADECTIAZMgAAcDIUt4DAAAAxfCjDgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACjcTsqZPAEAAAAAAAAAAAAAAAAAAAAAAFNPTC1QRVJQICAgICAgICAgICAgICAgICAgICAgICAgAAAAAAAAAAAAwusLAAAAAABcsuwiAAAAa6PKbQQAAAAPYARmAAAAAADh9QUAAAAAAAAAAAAAAAAAAAAAAAAAAJ+2SgAAAAAAbS8AAAAAAAAeBQAAAAAAAMgAAAAAAAAATB0AANQwAADoAwAA9AEAAAAAAAAQJwAATDAAABBWAAAAAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==");
let mut decoded_bytes = base64::decode(perp_market_str).unwrap();
let perp_market_bytes = decoded_bytes.as_mut_slice();

let key = Pubkey::default();
let owner = Pubkey::from_str("dRiftyHA39MWEi3m9aunc5MzRF1JYuBsbn6VPcn33UH").unwrap();
let mut lamports = 0;
let perp_market_account_info =
create_account_info(&key, true, &mut lamports, perp_market_bytes, &owner);

let perp_market_loader: AccountLoader<PerpMarket> =
AccountLoader::try_from(&perp_market_account_info).unwrap();
let mut perp_market = perp_market_loader.load_mut().unwrap();

let mut now = perp_market.amm.last_mark_price_twap_ts;
let mut slot = perp_market.amm.last_update_slot;

let mut precomputed_trade_price = perp_market.amm.last_mark_price_twap_5min;

assert_eq!(perp_market.amm.last_bid_price_twap, 182863738);
assert_eq!(perp_market.amm.last_ask_price_twap, 183684079);
assert_eq!(
perp_market.amm.historical_oracle_data.last_oracle_price,
182396220
);
assert_eq!(
perp_market
.amm
.historical_oracle_data
.last_oracle_price_twap,
182474466
);
assert_eq!(perp_market.amm.mark_std, 418_392);
assert_eq!(perp_market.amm.oracle_std, 78_246);

let og_est_market_spread = 820341;
assert_eq!(
perp_market.amm.last_ask_price_twap - perp_market.amm.last_bid_price_twap,
og_est_market_spread
);
let state = State::default();
let oracle_price_data = OraclePriceData {
price: perp_market.amm.historical_oracle_data.last_oracle_price,
confidence: PRICE_PRECISION_U64 / 100,
delay: 1,
has_sufficient_number_of_data_points: true,
};

for i in 0..3600 {
let t_delta = (i * (i % 3)) % 60;
now += t_delta;
slot += (t_delta * 2) as u64;
let mut direction = PositionDirection::Long;
if i % 2 == 0 {
direction = PositionDirection::Short;
}

if i % 2 == 0 {
precomputed_trade_price -= PRICE_PRECISION_U64 / 100;
assert_eq!(precomputed_trade_price, 183051875);
} else {
precomputed_trade_price += PRICE_PRECISION_U64 / 100;
assert_eq!(precomputed_trade_price, 183061875);
}
_update_amm(&mut perp_market, &oracle_price_data, &state, now, slot).unwrap();

let _res = update_mark_twap_from_estimates(
&mut perp_market.amm,
now,
Some(precomputed_trade_price),
Some(direction),
None,
)
.unwrap();
}

// new bid / ask twap matches long/short fills
assert_eq!(perp_market.amm.last_bid_price_twap, 182716029);
assert_eq!(perp_market.amm.last_ask_price_twap, 183172254);
assert_eq!(
perp_market.amm.historical_oracle_data.last_oracle_price,
182396220
);
assert_eq!(
perp_market
.amm
.historical_oracle_data
.last_oracle_price_twap,
182396282
);
assert_eq!(perp_market.amm.mark_std, 114212);
assert_eq!(perp_market.amm.oracle_std, 62);

assert!(
perp_market.amm.last_ask_price_twap - perp_market.amm.last_bid_price_twap
< og_est_market_spread
);
}

#[test]
fn est_bid_ask_amm_mark_update_iterative_price_up_only_tight() {
let perp_market_str = String::from("Ct8MLGv1N/dvAH3EF67yBqaUQerctpm4yqpK+QNSrXCQz76p+B+ka+8Ni2/aLOukHaFdQJXR2jkqDS+O0MbHvA9M+sjCgLVtPCXfCgAAAAAAAAAAAAAAAAUAAAAAAAAA4lbgCgAAAAD0ft4KAAAAANR4BGYAAAAACM8a0Hn//////////////1VDX2z9//////////////9QNResjr4LAAAAAAAAAAAAAAAAAAAAAABf+eFCkQUIAAAAAAAAAAAASGcYpdjVHAAAAAAAAAAAAJxiDwAAAAAAAAAAAAAAAACYFslxyfcHAAAAAAAAAAAAadwD2bgZCAAAAAAAAAAAACbmgal4NQ8AAAAAAAAAAABjPwYDAAAAAAAAAAAAAAAA84sXlajKHAAAAAAAAAAAAACRroLmLAIAAAAAAAAAAAAAJPP0h9f9////////////k+Op9x0DAAAAAAAAAAAAAG3R939QAQAAAAAAAAAAAAAAwFdzpXwCAAAAAAAAAAAAi0tQM5z//////////////7p9hfTAof/////////////iOtCPDFsAAAAAAAAAAAAAbOli63Kg/////////////2ZM0THnXAAAAAAAAAAAAABZuEr7un8BAAAAAAAAAAAA8i0bAgAAAADyLRsCAAAAAPItGwIAAAAAwKkWAQAAAADfxlwoCQYAAAAAAAAAAAAAsOH+aAICAAAAAAAAAAAAAN1CB2sXBAAAAAAAAAAAAABorLVKwAQAAAAAAAAAAAAAqigkm1kBAAAAAAAAAAAAAJKzRoiyAAAAAAAAAAAAAABK712SBQAAAAAAAAAAAAAAz5MThgUAAAAAAAAAAAAAAMG4+QwBAAAAAAAAAAAAAADz2LYf7fsHAAAAAAAAAAAAj6aNkqr4HAAAAAAAAAAAAALArDkjCAgAAAAAAAAAAACiuz90nswcAAAAAAAAAAAAPCXfCgAAAAAAAAAAAAAAAHpH5goAAAAA78vyCgAAAAC0iewKAAAAAHNN6QoAAAAAdLxODwAAAAAaBQAAAAAAAEv9vuf+////tmwEZgAAAAAQDgAAAAAAAADh9QUAAAAAZAAAAAAAAAAA4fUFAAAAAAAAAAAAAAAA4HqmTJlEAAAB+L898gAAAO2EvujZAAAAzngEZgAAAABYYgYAAAAAAKYxAQAAAAAAzngEZgAAAADECQAAqGEAAL0kAADECQAAJAAAAAAAAADECTIAZMgAAcDIUt4DAAAAxfCjDgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACjcTsqZPAEAAAAAAAAAAAAAAAAAAAAAAFNPTC1QRVJQICAgICAgICAgICAgICAgICAgICAgICAgAAAAAAAAAAAAwusLAAAAAABcsuwiAAAAa6PKbQQAAAAPYARmAAAAAADh9QUAAAAAAAAAAAAAAAAAAAAAAAAAAJ+2SgAAAAAAbS8AAAAAAAAeBQAAAAAAAMgAAAAAAAAATB0AANQwAADoAwAA9AEAAAAAAAAQJwAATDAAABBWAAAAAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==");
let mut decoded_bytes = base64::decode(perp_market_str).unwrap();
let perp_market_bytes = decoded_bytes.as_mut_slice();

let key = Pubkey::default();
let owner = Pubkey::from_str("dRiftyHA39MWEi3m9aunc5MzRF1JYuBsbn6VPcn33UH").unwrap();
let mut lamports = 0;
let perp_market_account_info =
create_account_info(&key, true, &mut lamports, perp_market_bytes, &owner);

let perp_market_loader: AccountLoader<PerpMarket> =
AccountLoader::try_from(&perp_market_account_info).unwrap();
let mut perp_market = perp_market_loader.load_mut().unwrap();

let og_now = perp_market.amm.last_mark_price_twap_ts;
let mut now = perp_market.amm.last_mark_price_twap_ts;
let mut slot = perp_market.amm.last_update_slot;

let mut precomputed_trade_price = perp_market.amm.last_mark_price_twap_5min;

assert_eq!(perp_market.amm.last_bid_price_twap, 182863738);
assert_eq!(perp_market.amm.last_ask_price_twap, 183684079);
assert_eq!(
perp_market.amm.historical_oracle_data.last_oracle_price,
182396220
);
assert_eq!(
perp_market
.amm
.historical_oracle_data
.last_oracle_price_twap,
182474466
);
assert_eq!(perp_market.amm.mark_std, 418_392);
assert_eq!(perp_market.amm.oracle_std, 78_246);

let og_est_market_spread = 820341;
assert_eq!(
perp_market.amm.last_ask_price_twap - perp_market.amm.last_bid_price_twap,
og_est_market_spread
);
let state = State::default();

for i in 0..3600 {
let t_delta = (i * (i % 3)) % 60;
now += t_delta;
slot += (t_delta * 2) as u64;
let mut direction = PositionDirection::Long;
if i % 2 == 0 {
direction = PositionDirection::Short;
}

if i % 2 == 0 {
precomputed_trade_price += PRICE_PRECISION_U64 / 100;
assert!(precomputed_trade_price >= 183051875);
} else {
precomputed_trade_price += PRICE_PRECISION_U64 / 200;
assert!(precomputed_trade_price >= 183061875);
}
let oracle_price_data = OraclePriceData {
price: precomputed_trade_price as i64,
confidence: PRICE_PRECISION_U64 / 100,
delay: 1,
has_sufficient_number_of_data_points: true,
};

_update_amm(&mut perp_market, &oracle_price_data, &state, now, slot).unwrap();

let _res = update_mark_twap_from_estimates(
&mut perp_market.amm,
now,
Some(precomputed_trade_price),
Some(direction),
None,
)
.unwrap();
}

assert_eq!(now - og_now, 72600); // 20 hours

// new bid / ask twap matches long/short fills
assert_eq!(perp_market.amm.last_mark_price_twap_5min, 209993833);
assert_eq!(perp_market.amm.last_mark_price_twap, 208787174);
assert_eq!(perp_market.amm.last_bid_price_twap, 208526183);
assert_eq!(perp_market.amm.last_ask_price_twap, 209048165);

assert_eq!(
perp_market.amm.historical_oracle_data.last_oracle_price,
210061875
);

let (long_start_offset, long_end_offset) =
OrderParams::get_perp_baseline_start_end_price_offset(
&perp_market,
PositionDirection::Long,
)
.unwrap();
assert_eq!(long_start_offset, -71292);
assert_eq!(long_end_offset, 2218275);

let (short_start_offset, short_end_offset) =
OrderParams::get_perp_baseline_start_end_price_offset(
&perp_market,
PositionDirection::Short,
)
.unwrap();
assert_eq!(short_start_offset, 202310);
assert_eq!(short_end_offset, -1558685);

assert_eq!(
perp_market
.amm
.historical_oracle_data
.last_oracle_price_twap,
208793593
);
assert_eq!(perp_market.amm.mark_std, 1291275);
assert_eq!(perp_market.amm.oracle_std, 1268282);

assert!(
perp_market.amm.last_ask_price_twap - perp_market.amm.last_bid_price_twap
< og_est_market_spread
);
}

#[test]
fn amm_split_large_k_with_rebase() {
let perp_market_str = String::from("Ct8MLGv1N/dvAH3EF67yBqaUQerctpm4yqpK+QNSrXCQz76p+B+ka+8Ni2/aLOukHaFdQJXR2jkqDS+O0MbHvA9M+sjCgLVtQwhkAQAAAAAAAAAAAAAAAAIAAAAAAAAAkI1kAQAAAAB6XWQBAAAAAO8yzWQAAAAAnJ7I3f///////////////2dHvwAAAAAAAAAAAAAAAABGiVjX6roAAAAAAAAAAAAAAAAAAAAAAAB1tO47J+xiAAAAAAAAAAAAGD03Fis3mgAAAAAAAAAAAJxiDwAAAAAAAAAAAAAAAABxqRCIGRxiAAAAAAAAAAAAEy8wZfK9YwAAAAAAAAAAAGZeZCE+g3sAAAAAAAAAAAAKYeQAAAAAAAAAAAAAAAAAlIvoyyc3mgAAAAAAAAAAAADQdQKjbgAAAAAAAAAAAAAAwu8g05H/////////////E6tNHAIAAAAAAAAAAAAAAO3mFwd0AAAAAAAAAAAAAAAAgPQg5rUAAAAAAAAAAAAAGkDtXR4AAAAAAAAAAAAAAEv0WeZW/f////////////9kUidaqAIAAAAAAAAAAAAA0ZMEr1H9/////////////w5/U3uqAgAAAAAAAAAAAAAANfbqfCd3AAAAAAAAAAAAIhABAAAAAAAiEAEAAAAAACIQAQAAAAAAY1QBAAAAAAA5f3WMVAAAAAAAAAAAAAAAFhkiihsAAAAAAAAAAAAAAO2EfWc5AAAAAAAAAAAAAACM/5CAQgAAAAAAAAAAAAAAvenX0SsAAAAAAAAAAAAAALgPUogZAAAAAAAAAAAAAAC01x97AAAAAAAAAAAAAAAAOXzVbgAAAAAAAAAAAAAAAMG4+QwBAAAAAAAAAAAAAABwHI3fLeJiAAAAAAAAAAAABvigOblGmgAAAAAAAAAAALeRnZsi9mIAAAAAAAAAAAAqgs3ynCeaAAAAAAAAAAAAQwhkAQAAAAAAAAAAAAAAAJOMZAEAAAAAFKJkAQAAAABTl2QBAAAAALFuZAEAAAAAgrx7DAAAAAAUAwAAAAAAAAN1TAYAAAAAuC7NZAAAAAAQDgAAAAAAAADh9QUAAAAAZAAAAAAAAAAA4fUFAAAAAAAAAAAAAAAAn2HvyMABAADGV6rZFwAAAE5Qg2oPAAAA8zHNZAAAAAAdYAAAAAAAAE2FAAAAAAAA6zLNZAAAAAD6AAAAaEIAABQDAAAUAwAAAAAAANcBAABkADIAZGQAAcDIUt4AAAAA0QQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI9qQbynsAAAAAAAAAAAAAAAAAAAAAAAAFNPTC1QRVJQICAgICAgICAgICAgICAgICAgICAgICAghuS1//////8A4fUFAAAAAAB0O6QLAAAAR7PdeQMAAAD+Mc1kAAAAAADKmjsAAAAAAAAAAAAAAAAAAAAAAAAAAOULDwAAAAAAUBkAAAAAAADtAQAAAAAAAMgAAAAAAAAAECcAAKhhAADoAwAA9AEAAAAAAAAQJwAAZAIAAGQCAAAAAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==");
Expand Down
23 changes: 19 additions & 4 deletions programs/drift/src/math/amm.rs
Original file line number Diff line number Diff line change
Expand Up @@ -155,8 +155,18 @@
let base_spread_price_u64 = last_oracle_price_u64
.safe_mul(amm.base_spread.cast::<u64>()?)?
.safe_div(PERCENTAGE_PRECISION_U64)?;
let long_spread_price_u64 = last_oracle_price_u64
.safe_mul(amm.long_spread.cast::<u64>()?)?
.safe_div(PERCENTAGE_PRECISION_U64)?;

Check warning on line 160 in programs/drift/src/math/amm.rs

View check run for this annotation

Codecov / codecov/patch

programs/drift/src/math/amm.rs#L160

Added line #L160 was not covered by tests
let short_spread_price_u64 = last_oracle_price_u64
.safe_mul(amm.short_spread.cast::<u64>()?)?
.safe_div(PERCENTAGE_PRECISION_U64)?;

Check warning on line 163 in programs/drift/src/math/amm.rs

View check run for this annotation

Codecov / codecov/patch

programs/drift/src/math/amm.rs#L163

Added line #L163 was not covered by tests
let max_spread_price_u64 = last_oracle_price_u64
.safe_mul(amm.base_spread.max(amm.max_spread).cast::<u64>()?)?
.safe_mul(
amm.base_spread
.max(amm.long_spread.safe_add(amm.short_spread)?)
.cast::<u64>()?,

Check warning on line 168 in programs/drift/src/math/amm.rs

View check run for this annotation

Codecov / codecov/patch

programs/drift/src/math/amm.rs#L168

Added line #L168 was not covered by tests
)?
.safe_div(PERCENTAGE_PRECISION_U64)?;

let trade_price: u64 = match precomputed_trade_price {
Expand All @@ -169,7 +179,8 @@
.safe_sub(amm.last_bid_price_twap.cast::<i64>()?)?
.max(0)
.unsigned_abs()
.clamp(base_spread_price_u64, max_spread_price_u64);
.clamp(base_spread_price_u64, max_spread_price_u64)
.min(amm.mark_std.max(amm.oracle_std).saturating_mul(2));

validate!(
amm.historical_oracle_data.last_oracle_price > 0,
Expand All @@ -183,7 +194,9 @@
let best_bid_estimate = if let Some(direction) = direction {
// taker is a long, hitting ask, assuming best bid is est_market_spread below
if direction == PositionDirection::Long {
trade_price.saturating_sub(est_market_spread)
trade_price
.saturating_sub(est_market_spread.min(short_spread_price_u64))
.min(last_oracle_price_u64)
} else {
trade_price
}
Expand All @@ -195,7 +208,9 @@
let best_ask_estimate = if let Some(direction) = direction {
// taker is a short, hitting bid, assuming best ask is est_market_spread above
if direction == PositionDirection::Short {
trade_price.saturating_add(est_market_spread)
trade_price
.saturating_add(est_market_spread.min(long_spread_price_u64))
.max(last_oracle_price_u64)
} else {
trade_price
}
Expand Down
21 changes: 11 additions & 10 deletions programs/drift/src/math/amm/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -647,12 +647,13 @@ fn update_mark_twap_tests() {
let new_bid_twap = amm.last_bid_price_twap;
let new_ask_twap = amm.last_ask_price_twap;

assert_eq!(new_ask_twap, 40_000_015);
assert_eq!(new_bid_twap, 40000005);
assert!(new_bid_twap < new_ask_twap);

assert_eq!(old_mark_twap, 40_000_000);
assert_eq!(new_mark_twap, 40_000_010);
assert!(new_mark_twap > old_mark_twap);
assert_eq!(new_ask_twap, 40_000_015);
assert_eq!(new_bid_twap, 40_000_005);
assert!(new_bid_twap < new_ask_twap);

while now < 3600 {
now += 1;
Expand All @@ -676,10 +677,10 @@ fn update_mark_twap_tests() {
assert_eq!((new_bid_twap + new_ask_twap) / 2, new_mark_twap);
assert!((new_oracle_twap as u64) < new_mark_twap); // funding in favor of maker?
assert_eq!(new_oracle_twap, 40008161);
assert_eq!(new_bid_twap, 40013203);
assert_eq!(new_mark_twap, 40023382); // ~ 2 cents above oracle twap
assert_eq!(new_bid_twap, 40014547);
assert_eq!(new_mark_twap, 40024054); // ~ 2 cents above oracle twap
assert_eq!(new_ask_twap, 40033561);
assert_eq!(amm.mark_std, 27902);
assert_eq!(amm.mark_std, 27230);
assert_eq!(amm.oracle_std, 3119);

let trade_price_2 = 39_971_280 * PRICE_PRECISION_U64 / 1_000_000;
Expand Down Expand Up @@ -712,16 +713,16 @@ fn update_mark_twap_tests() {
let new_bid_twap = amm.last_bid_price_twap;
let new_ask_twap = amm.last_ask_price_twap;

assert_eq!(new_bid_twap, 39_989_217);
assert_eq!(new_ask_twap, 40_004_701);
assert_eq!(new_bid_twap, 39989389);
assert_eq!(new_ask_twap, 40000790);
assert!(new_bid_twap < new_ask_twap);
assert_eq!((new_bid_twap + new_ask_twap) / 2, new_mark_twap);

assert_eq!(new_oracle_twap, 39_998_518);
assert_eq!(new_mark_twap, 39996959);
assert_eq!(new_mark_twap, 39995089);

assert!((new_oracle_twap as u64) >= new_mark_twap); // funding in favor of maker
assert_eq!(amm.mark_std, 26291);
assert_eq!(amm.mark_std, 24467);
assert_eq!(amm.oracle_std, 7238);
}

Expand Down
Loading
Loading