Skip to content

Commit 861a759

Browse files
0xbigzwphangithub-actions[bot]crispheaneylowkeynicc
authored
program: calc-ref-price-offset-calc-enhance (#1786)
* program: calc-ref-price-offset-calc-enhance * less jumpy calc and smaller control for max offset * sdk: add detailed subscription log name (#1773) * sdk: release v2.130.0-beta.2 * sdk: ws resubscribe verbose logging (#1774) * sdk: release v2.130.0-beta.3 * sdk: add timing on ws unsubscribe * sdk: release v2.130.0-beta.4 * program: add high leverage maintenance mode (#1759) * program: add-high-leverage-maintenance-mode * hlm disable bool * rm update last active slot in settle pnl * improve booting logic * add type * cargo fmt -- --------- Co-authored-by: Chris Heaney <[email protected]> Co-authored-by: Nick Caradonna <[email protected]> * sdk: release v2.130.0-beta.5 * sdk: log ws unsubscribe timeout error * sdk: release v2.130.0-beta.6 * Remove barrel imports from SDK (#1777) * sdk: release v2.130.0-beta.7 * Nour/mm oracle 2 (#1767) * program: new amm oracle (#1738) * zero unused amm fields * cargo fmt * bare bones ix * minimal anchor mm oracle impl * update test file * only do admin validate when not anchor test * updates * generalize native entry * fix weird function name chop off * make it compile for --feature cpi (#1748) Co-authored-by: jordy25519 <[email protected]> * more efficeint clock and state bit flags check * vamm uses mm oracle (#1747) * add offset * working tests * refactor to use MM oracle as its own type * remove weird preface * sdk updates * bankrun tests all pass * fix test * changes and fixes * widen confidence if mm oracle too diff * sdk side for confidence adjust * changelog * fix lint * fix cargo tests * address comments * add conf check * remove anchor ix and cache oracle confidence * only state admin can reenable mm oracle kill switch * cargo fmt --------- Co-authored-by: jordy25519 <[email protected]> * fix tests (#1764) * Nour/move ixs around (#1766) * move around ixs * remove message * add devnet oracle crank wallet * refactored mm oracle * sdk changes + cargo fmt * fix tests * validate price bands with fill fix * normalize fill within price bands * add sdk warning * updated type * undefined guard so anchor tests pass * accept vec for update amm and view amm * adjust test to work with new price bands * Revert "adjust test to work with new price bands" This reverts commit ee40ac8. * remove price bands logic * add zero ix for mm oracle for reset * mm oracle improvements (#1771) * v1 safety improvements * isolate funding from MM oracle * add cargo tests for amm availability * change oracle validity log bool to enum * address comment --------- Co-authored-by: moosecat <[email protected]> Co-authored-by: jordy25519 <[email protected]> * sdk: release v2.130.0-beta.8 * Improve circular dependencies 1 (#1776) * sdk: release v2.130.0-beta.9 * Improve Circular Dependencies 2 (#1778) * sdk: release v2.130.0-beta.10 * Remove Circular Dependencies 3 (#1779) * sdk: release v2.130.0-beta.11 * vamm l2 oracle changes (#1780) * vamm l2 oracle changes * add drift client types to barrel file * sdk: release v2.130.0-beta.12 * program: stop counting reduce only orders to open bids/asks (#1746) * program: stop counting reduce only orders to open bids/asks * account for old vs new reduce only orders * add sdk * ignore max lev flag for reduce only orders * tweak filter logic * test * moar tests * simplify * only exclude tpsl * cargo fmt -- * tweak * more tweaks * Nour/validate fill change (#1772) * program: new amm oracle (#1738) * zero unused amm fields * cargo fmt * bare bones ix * minimal anchor mm oracle impl * update test file * only do admin validate when not anchor test * updates * generalize native entry * fix weird function name chop off * make it compile for --feature cpi (#1748) Co-authored-by: jordy25519 <[email protected]> * more efficeint clock and state bit flags check * vamm uses mm oracle (#1747) * add offset * working tests * refactor to use MM oracle as its own type * remove weird preface * sdk updates * bankrun tests all pass * fix test * changes and fixes * widen confidence if mm oracle too diff * sdk side for confidence adjust * changelog * fix lint * fix cargo tests * address comments * add conf check * remove anchor ix and cache oracle confidence * only state admin can reenable mm oracle kill switch * cargo fmt --------- Co-authored-by: jordy25519 <[email protected]> * fix tests (#1764) * Nour/move ixs around (#1766) * move around ixs * remove message * add devnet oracle crank wallet * refactored mm oracle * sdk changes + cargo fmt * fix tests * validate price bands with fill fix * normalize fill within price bands * add sdk warning * updated type * undefined guard so anchor tests pass * accept vec for update amm and view amm * adjust test to work with new price bands * Revert "adjust test to work with new price bands" This reverts commit ee40ac8. * remove price bands logic * add zero ix for mm oracle for reset * v1 safety improvements * isolate funding from MM oracle * add cargo tests for amm availability * change oracle validity log bool to enum * address comment * make validate fill direction agnostic * fix liquidate borrow for perp pnl test * fix tests and address comments --------- Co-authored-by: jordy25519 <[email protected]> * sdk: release v2.130.0-beta.13 * sdk: revert drift interface (#1784) * Revert "Remove Circular Dependencies 3 (#1779)" This reverts commit 697ce50. * Revert "Improve Circular Dependencies 2 (#1778)" This reverts commit f09b59d. * Revert "Improve circular dependencies 1 (#1776)" This reverts commit f4e3333. * prettify:fix * sdk: release v2.130.0-beta.14 * sdk: restore grpc disconnect default behavior (#1782) * sdk: release v2.130.0-beta.15 * program: trigger price based on oracle and basis (#1716) * init * shrink for time since last funding * add max diff * use trigger price isntead of oracle * add event * more tests * update for contract tier C * add ts code * return early instead of throw error * sdk: rename oraclePrice to triggerPrice * feature flag * styling * address comments * parentheses * casts * CHANGELOG * sdk: release v2.130.0-beta.16 * add missing CHANGELOGs * v2.130.0 * sdk: release v2.131.0-beta.0 * Add lint for index imports (#1787) * sdk: release v2.131.0-beta.1 * sdk: revert grpc account subscribers to v2.126.0-beta.0 (#1789) * sdk: release v2.131.0-beta.2 * sdk: backwards compatible idl * sdk: release v2.131.0-beta.3 * lukas/gill websocket sub (#1781) * websockets gill temp * feat: feature parity between gill version ws acct sub and reg one + optional passing into driftClient * fix: post rebase bugs and cleanup * chore: websocket account subscriber export * feat: logging string update on ws acct v2 * rm: useless logging * chore: cleanup ws subscriber v2 docs * chore: specific name on custom ws acct sub param * fix: post rebase again cleanup * fix: prettier fixed * sdk: release v2.131.0-beta.4 * Update main.yml * refactor(sdk): add MAX_APR_PER_REVENUE_SETTLE_TO_INSURANCE_FUND_VAULT_GOV * sdk: release v2.131.0-beta.5 * refactor(sdk): improve exports * sdk: release v2.131.0-beta.6 * sdk: updated idl * sdk: release v2.131.0-beta.7 * feat: initial websocket v2 program account sub * sdk: release v2.131.0-beta.8 * fix: ws v2 subscriber hangs on async iterable loop (#1793) * sdk: release v2.131.0-beta.9 * fix: websocket order subscriber using v2 too soon * sdk: release v2.131.0-beta.10 * sdk: enter-high-leverage-mode-false (#1791) * sdk: release v2.131.0-beta.11 * refactor(sdk): allow user client input for cancel orders (#1797) * refactor(sdk): minimize type for getPerpPositionValue * sdk: release v2.131.0-beta.12 * program: relax fill validation for spot/swap (#1796) * program: relax fill validation for spot/swap * account for external fills * CHANGELOG * program: update fee tier (#1792) * program: determine-fee-tier-update (reorg) * update user stats check logic * remove unnecessary clone * less mul operations * rm unwrap * update sdk * fix styling * use satsub * update changelog * sdk lint * sdk: release v2.131.0-beta.13 * v2.131.0 * sdk: release v2.132.0-beta.0 * program: update-fee-tier-validates (#1798) * program: update-fee-tier-validates * inc max * v2.131.1 * sdk: release v2.132.0-beta.0 * sdk: add missing param for updatePerpMarketAmmSpreadAdjustment * sdk: release v2.132.0-beta.1 * sdk: fix consts in calculateWithdrawLimit * sdk: release v2.132.0-beta.2 * sdk: rm legacy code for updateAmms * sdk: release v2.132.0-beta.3 * refactor(sdk): refine oracle price data input types * sdk: release v2.132.0-beta.4 * program: update-max-borrow-token-amount-deltas (#1801) * program: update-max-borrow-token-amount-deltas * fix tests * sdk match * update changelog * sdk: release v2.132.0-beta.5 * v2.132.0 * sdk: release v2.133.0-beta.0 * sdk: fix modify order post only * sdk: release v2.133.0-beta.1 * program: amm-spread-inventory-spread-adj-base-spread-lb (#1803) * program: always fail settle pnl even if try_settle used (#1809) * program: always fail settle pnl even if try_settle used * CHANGELOG * disable test --------- Co-authored-by: wphan <[email protected]> * v2.133.0 * sdk: release v2.134.0-beta.0 * refactor(sdk): add getActivePositions to user * sdk: release v2.134.0-beta.1 * sdk: add spot-market-index-57 to constants (#1815) * sdk: release v2.134.0-beta.2 * lazer oracle migration (#1813) * lazer oracle migration * spot markets too * sdk: release v2.134.0-beta.3 * feat: option for custom oracle ws subscriber * fix: pass custom oracle ws sub option in dc constructor * sdk: release v2.134.0-beta.4 * program: settle pnl invariants (#1812) * program: settle pnl invariants * add test * fix lint * lints * add msg * CHANGELOG * cargo fmt -- * program: add_update_perp_pnl_pool (#1810) * program: add_update_perp_pnl_pool * test * CHANGELOG * sdk: release v2.134.0-beta.5 * program: update-mark-twap-integer-bias (#1783) * program: update-mark-twap-integer-bias * changelog update * program: update-fee-tier-determine-fix5 (#1800) * program: update-fee-tier-determine-fix5 * update changelog * program: update-mark-twap-crank-use-5min-basis (#1769) * program: update-mark-twap-crank-use-5min-basis * changelog * program: update-min-margin-const-limit (#1802) * program: update-min-margin-const-limit * add CHANGELOG.md * sdk: release v2.134.0-beta.6 * program: rm-burn-lp-shares-invariant (#1816) * program: rm-burn-lp-shares-invariant * update changelog * fix test and cargo fmt * fix anchor tests * yarn prettify:fix * reenable settle_pnl mode test * v2.134.0 * sdk: release v2.135.0-beta.0 * Merge pull request #1820 from drift-labs/chester/fix-zod * sdk: release v2.135.0-beta.1 * mm oracle sdk change (#1806) * mm oracle sdk change * better conditional typing * DLOB bug fix * updated idl * rm getAmmBidAskPrice * sdk: release v2.135.0-beta.2 * sdk: fix isHighLeverageMode * sdk: release v2.135.0-beta.3 * refactor(sdk): add update delegate ix method, ovrride authority for settle multiple pnl (#1822) * mm oracle sdk additions (#1824) * strict typing for more MM oracle contact points * add comments to auction.ts * prettify * sdk: release v2.135.0-beta.4 * add strict typing for getPrice and new auction trigger function (#1826) * add strict typing for getPrice and new auction trigger function * refactor getTriggerAuctionStartAndExecutionPrice * sdk: release v2.135.0-beta.5 * sdk: handle unfillable reduce only orders (#1790) * sdk: handle unfillable reduce only orders * fix dlob tests build errors * fix some test build errors * sdk: release v2.135.0-beta.6 * ref price offset amm math fix (#1828) * ref price offset amm math fix * add latest slot optional var to callers of update amm spread * sdk: release v2.135.0-beta.7 * latest slot as argument to getL2 (#1829) * latest slot as argument to getL2 * add comment * update BN import * sdk: release v2.135.0-beta.8 * program: trigger price use 5min mark price (#1830) * program: trigger price use 5min mark price * cargo fmt -- --------- Co-authored-by: 0xbigz <[email protected]> * v2.135.0 * sdk: release v2.136.0-beta.0 * lukas/websocket improvements (#1807) * feat: initial implementation for users and markets WS improvements * lukas/gill websocket sub (#1781) * websockets gill temp * feat: feature parity between gill version ws acct sub and reg one + optional passing into driftClient * fix: post rebase bugs and cleanup * chore: websocket account subscriber export * feat: logging string update on ws acct v2 * rm: useless logging * chore: cleanup ws subscriber v2 docs * chore: specific name on custom ws acct sub param * fix: post rebase again cleanup * fix: prettier fixed * feat: initial implementation for users and markets WS improvements * feat: polling check on websocket acct subscriber v2 + naming * fix: lint * fix: non-hanging WS subscription async loop handling * fix: bugs with program ws subs hanging on asynciter * fix: goofy self imports * feat: initial batch fetching temp * temp: sub second WS subscribe time * fix: ws program account subscriber v2 bugs and optimizations * feat: chunk stuff account requests * feat: more subscribe optimizations ws driftclient sub v2 * chore: cleanup ws sub v2 logs * feat: conditional check on using ws account subscriber + unused * fix: bad import * chore: add export of WebSocketProgramAccountSubscriberV2 * fix: unneeded drift idl export messing up common build * fix: consolidate rpc ws subscriptions for oracles * feat: docs for ws v2 and cleanup * chore: more docs on ws acct susbcriber v2 * feat: PR feedback round 2 * fix: default timeout for ws v2 susbcribers * feat: PR feedback on resubOpts and simplify logic * fix: prettier * sdk: release v2.136.0-beta.1 * refactor(sdk): add decimal override for bignum prettyPrint * sdk: release v2.136.0-beta.2 * sdk: while valid tx sender memory leak fix * sdk: release v2.136.0-beta.3 * [ FIX ] `posaune0423/fix tx fee payer` (#1837) * sdk: release v2.136.0-beta.4 * sdk: add constant for spot market index 58 (#1840) * sdk: add spot market constant 58 * revert .sh * sdk: release v2.136.0-beta.5 * Revert "[ FIX ] `posaune0423/fix tx fee payer` (#1837)" (#1841) This reverts commit 8cc07e0. * sdk: release v2.136.0-beta.6 * Add buildDepositAndPlaceSignedMsgOrderRequest helper for swift deposi… (#1839) * Add buildDepositAndPlaceSignedMsgOrderRequest helper for swift deposit to trade requests * sdk: release v2.136.0-beta.7 * program: update-ref-fee-validate-rules (#1843) * program: update-ref-fee-validate-rules * update changelog * v2.136.0 * sdk: release v2.137.0-beta.0 * program: rm lp (#1755) * program: make lp shares reduce only * init * rm more fields * make tests build * start sdk changes * merge master 2 * fix fmt + sqrt_k lower bound and some tests * more test update prog * rm anchor tests * rename of old lp related variables * remove multi AMMLiquiditySplit logic/enums * lint fix * fix tests * CHANGELOG --------- Co-authored-by: 0xbigz <[email protected]> * sdk: release v2.137.0-beta.1 * bump * program: add swift message padding (#1845) * program: add updated swift message * add tests * update tests * CHANGELOG --------- Co-authored-by: Chris Heaney <[email protected]> * program: add max margin ratio per position (#1847) * program: add max margin ratio perp position * program: test for custom perp position margin ratio * test * make max margin ratio persist * update user level max margin ratio * naming nit * CHANGELOG * tweak cargo tests * cargo fmt -- * lukas/per market lev (#1862) * feat: per market max leverage * fix: max margin ratio correct naming and decoding * fix: correctly decode perp position max lev * fix: add missing metadata for drift address on idl * sdk: release v2.137.0-beta.2 * program: add max margin ratio to swift message (#1860) * program: add max margin ratio to swift message * CHANGELOG * ts test * fix tests * lints * sdk: release v2.137.0-beta.3 * program: revert swift max margin ratio (#1874) * Revert "program: add max margin ratio to swift message (#1860)" This reverts commit eaa7066. * Revert "program: add swift message padding (#1845)" This reverts commit ecfc19a. * sdk: release v2.137.0-beta.4 * add helper to build swiftDepositTrade tx (#1868) * add helper to build swiftDepositTrade tx * sdk: release v2.137.0-beta.5 * add optional maintenance arge to disable hlm ix (#1869) * sdk: release v2.137.0-beta.6 * program: make mm oracle sequence id based (#1834) * make mm oracle sequence id based * sdkbug fix * add volatiltiy check for sequence ids * add zero checks for sequnce ids * safe div * CHANGELOG * cargo fmt -- --------- Co-authored-by: Chris Heaney <[email protected]> * sdk: release v2.137.0-beta.7 * program: relax fee tier constraints for maker tier (#1876) * program: fix-fee-validate-different-denoms * fix build * CHANGELOG --------- Co-authored-by: Chris Heaney <[email protected]> * program: make it easer to fill min order size orders (#1799) * program: make it easer to fill min order size orders * reduce only tweak * CHANGELOG * program: fix clippy * fix cargo test * program: apply reduce only logic for post only orders (#1878) * program: apply reduce only logic for post only orders * CHANGELOG * fix tests * v2.237.0 * sdk: release v2.138.0-beta.0 * refactor(sdk): export TransactionParamProcessor * sdk: release v2.138.0-beta.1 * add hlmm to decodeUser (#1881) * add hlmm to decodeUser * throw if unrecognized margin mode * fallback to default margin mode * sdk: release v2.138.0-beta.2 * chore: add laserstream client * fix: update to correct naming * sdk: release v2.138.0-beta.3 * chore: rename lazer -> laser * sdk: release v2.138.0-beta.4 * Revert "chore: rename lazer -> laser" This reverts commit f6d8530. * Revert "fix: update to correct naming" This reverts commit 42c8b10. * Revert "chore: add laserstream client" This reverts commit 8da91cb. * sdk: release v2.138.0-beta.5 * feat: pin deps away from mal packages (#1858) * feat: pin deps away from mal packages * fix: chalk deps break lint * fix: linter unix format * try fix broken anchor tests --------- Co-authored-by: Nick Caradonna <[email protected]> * sdk: release v2.138.0-beta.6 * Revert "Crispeaney/revert swift max margin ratio" (#1877) * Revert "program: revert swift max margin ratio (#1874)" This reverts commit 87bfe72. * add SignedMsgExtensions enum struct variant * Revert "add SignedMsgExtensions enum struct variant" This reverts commit 9dbe65c. * add extended SignedMsgOrderParamsMessage variant * zero pad short swift messages when decoding * revert to single sdk decode function * cargo fmt * comments * use fixed padding for sdk swift decode fn * fix comments * sdk: release v2.138.0-beta.7 * add lp events for evnet subscriber (#1892) * add lp events for evnet subscriber * idl build * sdk: release v2.138.0-beta.8 * CHANGELOG * sdk: fix idl * program: token 22 scaled ui support (#1894) * init * program: scaled ui working * cargo fmt -- * ts lint * sdk: release v2.138.0-beta.9 * fix build * program: add log for get_vault_len * fix cargo build errors * program: rm update devnet drift * sdk: rm unused param * fix comments (#1844) * program: tweak ResizeSignedMsgUserOrders (#1898) * fix linter and cargo test * fix cargo build errors * v2.138.0 * sdk: release v2.139.0-beta.0 * test update * update ref price smoothing logic (wip tests) * unsigned liquidity frac mul * rm val_change * update tests * revert get_protocol_owned_position change * fix mul --------- Co-authored-by: wphan <[email protected]> Co-authored-by: GitHub Actions <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Chris Heaney <[email protected]> Co-authored-by: Nick Caradonna <[email protected]> Co-authored-by: Chester Sim <[email protected]> Co-authored-by: moosecat <[email protected]> Co-authored-by: jordy25519 <[email protected]> Co-authored-by: LukasDeco <[email protected]> Co-authored-by: Lukas deConantsesznak <[email protected]> Co-authored-by: asuma <[email protected]> Co-authored-by: lowkeynicc <[email protected]> Co-authored-by: Jack Waller <[email protected]>
1 parent 1f3971c commit 861a759

File tree

6 files changed

+105
-85
lines changed

6 files changed

+105
-85
lines changed

programs/drift/src/controller/amm.rs

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,7 @@ pub fn update_spreads(
277277
market.amm.short_spread = short_spread;
278278

279279
let do_reference_price_smooth = {
280+
// let val_changed: bool = reference_price_offset != market.amm.reference_price_offset;
280281
let sign_changed: bool =
281282
reference_price_offset.signum() != market.amm.reference_price_offset.signum();
282283

@@ -292,18 +293,18 @@ pub fn update_spreads(
292293
.saturating_sub(market.amm.reference_price_offset.cast::<i128>()?);
293294
let raw = full_offset_delta
294295
.abs()
295-
.cast::<i128>()?
296-
.min(slots_passed.cast::<i128>()?.safe_mul(1000)?)
297-
.cast::<i128>()?
296+
.min(slots_passed.cast::<i128>()?.safe_mul(1000_i128)?)
298297
.safe_div(10_i128)?
299298
.cast::<i32>()?;
300299

301300
full_offset_delta.signum().cast::<i32>()?
302-
* (raw.max(10).min(if market.amm.reference_price_offset != 0 {
303-
market.amm.reference_price_offset.abs()
304-
} else {
305-
reference_price_offset.abs()
306-
}))
301+
* (raw
302+
.max(10_i32)
303+
.min(if market.amm.reference_price_offset != 0 {
304+
market.amm.reference_price_offset.abs()
305+
} else {
306+
reference_price_offset.abs()
307+
}))
307308
};
308309

309310
market.amm.reference_price_offset = market

programs/drift/src/controller/position/tests.rs

Lines changed: 63 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -627,7 +627,7 @@ fn amm_ref_price_decay_tail_test() {
627627
assert_eq!(res, 0);
628628

629629
let mut now = perp_market.amm.last_mark_price_twap_ts + 1;
630-
let mut clock_slot = 354806508 + 1; // todo
630+
let mut clock_slot = perp_market.amm.last_update_slot;
631631
let state = State::default();
632632
let oracle_price_data = OraclePriceData {
633633
price: 3610241,
@@ -653,7 +653,7 @@ fn amm_ref_price_decay_tail_test() {
653653
.unwrap();
654654
assert_eq!(perp_market.amm.last_update_slot, clock_slot);
655655
assert_eq!(perp_market.amm.last_oracle_valid, true);
656-
assert_eq!(perp_market.amm.reference_price_offset, -236093);
656+
assert_eq!(perp_market.amm.reference_price_offset, -236183);
657657

658658
// Run decay steps
659659
let mut offsets = Vec::new();
@@ -696,30 +696,30 @@ fn amm_ref_price_decay_tail_test() {
696696
assert_eq!(
697697
offsets,
698698
[
699-
-212475, -191219, -172089, -154872, -139376, -125430, -125410, -125390, -125370,
700-
-125350, -112806, -101517, -91357, -82213, -73983, -66576, -59910, -53910, -48510,
701-
-43650, -39276, -35340, -31797, -28609, -25740, -23157, -20833, -18741, -16858, -15164,
702-
-13639, -12267, -11032, -9920, -8919, -8019, -7209, -6480, -5823, -5232, -4700, -4221,
699+
-212556, -191292, -172154, -154930, -139428, -125477, -125457, -125437, -125417,
700+
-125397, -112849, -101556, -91392, -82244, -74011, -66601, -59932, -53930, -48528,
701+
-43667, -39292, -35354, -31810, -28620, -25749, -23166, -20841, -18748, -16865, -15170,
702+
-13644, -12271, -11035, -9923, -8922, -8021, -7210, -6480, -5823, -5232, -4700, -4221,
703703
-3790, -3402, -3053, -2739, -2457, -2203, -1974, -1768, -1583, -1416, -1266, -1131,
704704
-1009, -900, -801, -712, -632, -560
705705
]
706706
);
707707
assert_eq!(
708708
lspreads,
709709
[
710-
212587, 191331, 172201, 154984, 139488, 125542, 125522, 125502, 125482, 125462, 112918,
711-
101629, 91469, 82325, 74095, 66688, 60022, 54022, 48622, 43762, 39388, 35452, 31909,
712-
28721, 25852, 23269, 20945, 18853, 16970, 15276, 13751, 12379, 11144, 10032, 9031,
713-
8131, 7321, 6592, 5935, 5344, 4812, 4333, 3902, 3514, 3165, 2851, 2569, 2315, 2086,
710+
212668, 191404, 172266, 155042, 139540, 125589, 125569, 125549, 125529, 125509, 112961,
711+
101668, 91504, 82356, 74123, 66713, 60044, 54042, 48640, 43779, 39404, 35466, 31922,
712+
28732, 25861, 23278, 20953, 18860, 16977, 15282, 13756, 12383, 11147, 10035, 9034,
713+
8133, 7322, 6592, 5935, 5344, 4812, 4333, 3902, 3514, 3165, 2851, 2569, 2315, 2086,
714714
1880, 1695, 1528, 1378, 1243, 1121, 1012, 913, 824, 744, 672
715715
]
716716
);
717717
assert_eq!(
718718
sspreads,
719719
[
720-
23633, 21271, 19145, 17232, 15511, 13961, 35, 35, 35, 35, 12559, 11304, 10175, 9159,
721-
8245, 7422, 6681, 6015, 5415, 4875, 4389, 3951, 3558, 3203, 2884, 2598, 2339, 2107,
722-
1898, 1709, 1540, 1387, 1250, 1127, 1016, 915, 825, 744, 672, 606, 547, 494, 446, 403,
720+
23642, 21279, 19153, 17239, 15517, 13966, 35, 35, 35, 35, 12563, 11308, 10179, 9163,
721+
8248, 7425, 6684, 6017, 5417, 4876, 4390, 3953, 3559, 3205, 2886, 2598, 2340, 2108,
722+
1898, 1710, 1541, 1388, 1251, 1127, 1016, 916, 826, 745, 672, 606, 547, 494, 446, 403,
723723
364, 329, 297, 269, 244, 221, 200, 182, 165, 150, 137, 124, 114, 104, 95, 87
724724
]
725725
);
@@ -804,7 +804,7 @@ fn amm_ref_price_offset_decay_logic() {
804804
assert_eq!(res, 10000);
805805

806806
let mut now = perp_market.amm.last_mark_price_twap_ts + 10;
807-
let mut clock_slot = 353317544 + 20; // todo
807+
let mut clock_slot = perp_market.amm.last_update_slot;
808808
let state = State::default();
809809
let oracle_price_data = OraclePriceData {
810810
price: 120003893646,
@@ -830,7 +830,7 @@ fn amm_ref_price_offset_decay_logic() {
830830
.unwrap();
831831
assert_eq!(perp_market.amm.last_update_slot, clock_slot);
832832
assert_eq!(perp_market.amm.last_oracle_valid, true);
833-
assert_eq!(perp_market.amm.reference_price_offset, 4458);
833+
assert_eq!(perp_market.amm.reference_price_offset, 10000);
834834

835835
perp_market.amm.last_mark_price_twap_5min = (perp_market
836836
.amm
@@ -880,28 +880,30 @@ fn amm_ref_price_offset_decay_logic() {
880880
assert_eq!(
881881
offsets,
882882
[
883-
4248, 4038, 3828, 3618, 3408, 3198, 3178, 3158, 3138, 3118, 2908, 2698, 2488, 2278,
884-
2068, 1858, 1664, 1489, 1332, 1190, 1062, 947, 844, 751, 667, 592, 524, 463, 408, 359,
885-
315, 275, 239, 207, 178, 152, 128, 107, 87, 67, 47, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0,
886-
0, 0, 0, 0, 0, 0, 0, 0
883+
9790, 9580, 9370, 9160, 8950, 8740, 8720, 8700, 8680, 8660, 8450, 8240, 8030, 7820,
884+
7610, 7400, 7190, 6980, 6770, 6560, 6350, 6140, 5930, 5720, 5510, 5300, 5090, 4880,
885+
4670, 4460, 4250, 4040, 3830, 3620, 3410, 3200, 2990, 2780, 2570, 2360, 2150, 1940,
886+
1737, 1555, 1391, 1243, 1110, 990, 882, 785, 698, 620, 549, 486, 429, 378, 332, 290,
887+
252, 218
887888
]
888889
);
889890
assert_eq!(
890891
lspreads,
891892
[
892-
726, 726, 726, 726, 726, 726, 536, 536, 536, 536, 726, 726, 726, 726, 726, 726, 710,
893-
691, 673, 658, 644, 631, 619, 609, 600, 591, 584, 577, 571, 565, 560, 556, 552, 548,
894-
545, 542, 540, 537, 536, 536, 536, 536, 536, 526, 526, 526, 526, 526, 526, 526, 526,
895-
526, 526, 526, 526, 526, 526, 526, 526, 526
893+
726, 726, 726, 726, 726, 726, 536, 536, 536, 536, 726, 726, 726, 726, 726, 726, 726,
894+
726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726,
895+
726, 726, 726, 726, 726, 726, 726, 726, 719, 698, 680, 664, 649, 636, 624, 613, 603,
896+
594, 587, 579, 573, 567, 562, 558, 554, 550
896897
]
897898
);
898899
assert_eq!(
899900
sspreads,
900901
[
901-
4258, 4048, 3838, 3628, 3418, 3208, 3188, 3168, 3148, 3128, 2918, 2708, 2498, 2288,
902-
2078, 1868, 1674, 1499, 1342, 1200, 1072, 957, 854, 761, 677, 602, 534, 473, 418, 369,
903-
325, 285, 249, 217, 188, 162, 138, 117, 97, 77, 57, 37, 17, 10, 10, 10, 10, 10, 10, 10,
904-
10, 10, 10, 10, 10, 10, 10, 10, 10, 10
902+
9800, 9590, 9380, 9170, 8960, 8750, 8730, 8710, 8690, 8670, 8460, 8250, 8040, 7830,
903+
7620, 7410, 7200, 6990, 6780, 6570, 6360, 6150, 5940, 5730, 5520, 5310, 5100, 4890,
904+
4680, 4470, 4260, 4050, 3840, 3630, 3420, 3210, 3000, 2790, 2580, 2370, 2160, 1950,
905+
1747, 1565, 1401, 1253, 1120, 1000, 892, 795, 708, 630, 559, 496, 439, 388, 342, 300,
906+
262, 228
905907
]
906908
);
907909
}
@@ -979,7 +981,7 @@ fn amm_negative_ref_price_offset_decay_logic() {
979981
assert_eq!(res, 10000);
980982

981983
let mut now = perp_market.amm.last_mark_price_twap_ts + 10;
982-
let mut clock_slot = 353317544 + 20; // todo
984+
let mut clock_slot = perp_market.amm.last_update_slot;
983985
let state = State::default();
984986
let oracle_price_data = OraclePriceData {
985987
price: 120003893646,
@@ -1005,7 +1007,7 @@ fn amm_negative_ref_price_offset_decay_logic() {
10051007
.unwrap();
10061008
assert_eq!(perp_market.amm.last_update_slot, clock_slot);
10071009
assert_eq!(perp_market.amm.last_oracle_valid, true);
1008-
assert_eq!(perp_market.amm.reference_price_offset, 4458);
1010+
assert_eq!(perp_market.amm.reference_price_offset, 10000);
10091011

10101012
perp_market.amm.last_mark_price_twap_5min = (perp_market
10111013
.amm
@@ -1051,36 +1053,46 @@ fn amm_negative_ref_price_offset_decay_logic() {
10511053
offsets.push(perp_market.amm.reference_price_offset);
10521054
lspreads.push(perp_market.amm.long_spread);
10531055
sspreads.push(perp_market.amm.short_spread);
1056+
1057+
// if perp_market.amm.reference_price_offset == 0 {
1058+
// assert_eq!(i, 1);
1059+
// }
10541060
}
10551061

1062+
// assert_eq!(lspreads[52], 0);
1063+
// assert_eq!(lspreads[51], 0); // when offset flips
1064+
10561065
assert_eq!(
10571066
offsets,
10581067
[
1059-
-4248, -4038, -3828, -3618, -3408, -3198, -3178, -3158, -3138, -3118, -2908, -2698,
1060-
-2488, -2278, -2068, -1858, -1648, -1438, -1228, -1018, -808, -598, -388, -178, 0,
1061-
7654, 7652, 7651, 7649, 7648, 7646, 7645, 7643, 7641, 7640, 7638, 7637, 7635, 7634,
1062-
7632, 7631, 7629, 7628, 7626, 7625, 7623, 7622, 7620, 7619, 7618, 7616, 7615, 7613,
1063-
7612, 7610, 7609, 7607, 7606, 7605, 7603, 7602, 7600, 7599, 7597, 7596, 7595, 7593,
1064-
7592, 7591, 7589, 7588, 7586, 7585, 7584, 7582, 7581, 7580, 7578, 7577, 7576
1068+
-9790, -9580, -9370, -9160, -8950, -8740, -8720, -8700, -8680, -8660, -8450, -8240,
1069+
-8030, -7820, -7610, -7400, -7190, -6980, -6770, -6560, -6350, -6140, -5930, -5720,
1070+
-5510, -5300, -5090, -4880, -4670, -4460, -4250, -4040, -3830, -3620, -3410, -3200,
1071+
-2990, -2780, -2570, -2360, -2150, -1940, -1730, -1520, -1310, -1100, -890, -680, -470,
1072+
-260, -50, 0, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000,
1073+
10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000,
1074+
10000, 10000, 10000, 10000, 10000, 10000
10651075
]
10661076
);
10671077
assert_eq!(
10681078
sspreads,
10691079
[
10701080
210, 210, 210, 210, 210, 210, 20, 20, 20, 20, 210, 210, 210, 210, 210, 210, 210, 210,
1071-
210, 210, 210, 210, 210, 210, 178, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
1081+
210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210,
1082+
210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 50, 10,
10721083
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
1073-
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10
1084+
10, 10, 10, 10, 10
10741085
]
10751086
);
10761087
assert_eq!(
10771088
lspreads,
10781089
[
1079-
4774, 4564, 4354, 4144, 3934, 3724, 3704, 3684, 3664, 3644, 3434, 3224, 3014, 2804,
1080-
2594, 2384, 2174, 1964, 1754, 1544, 1334, 1124, 914, 704, 526, 526, 526, 526, 526, 526,
1081-
526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526,
1090+
10316, 10106, 9896, 9686, 9476, 9266, 9246, 9226, 9206, 9186, 8976, 8766, 8556, 8346,
1091+
8136, 7926, 7716, 7506, 7296, 7086, 6876, 6666, 6456, 6246, 6036, 5826, 5616, 5406,
1092+
5196, 4986, 4776, 4566, 4356, 4146, 3936, 3726, 3516, 3306, 3096, 2886, 2676, 2466,
1093+
2256, 2046, 1836, 1626, 1416, 1206, 996, 786, 576, 526, 526, 526, 526, 526, 526, 526,
10821094
526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526,
1083-
526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526
1095+
526, 526, 526, 526, 526
10841096
]
10851097
);
10861098
}
@@ -1195,18 +1207,18 @@ fn amm_perp_ref_offset() {
11951207

11961208
let r = perp_market.amm.reserve_price().unwrap();
11971209
let (b, a) = perp_market.amm.bid_ask_price(r).unwrap();
1198-
assert_eq!(b, 7098999);
1199-
assert_eq!(a, 7106129);
1210+
assert_eq!(b, 7108594);
1211+
assert_eq!(a, 7115724);
12001212
assert_eq!(
12011213
perp_market.amm.historical_oracle_data.last_oracle_price,
12021214
7101600
12031215
);
1204-
assert_eq!(perp_market.amm.reference_price_offset, 134);
1216+
assert_eq!(perp_market.amm.reference_price_offset, 1485);
12051217
assert_eq!(perp_market.amm.max_spread, 90000);
12061218

12071219
assert_eq!(r, 7101599);
1208-
assert_eq!(perp_market.amm.bid_base_asset_reserve, 4675159724262455);
1209-
assert_eq!(perp_market.amm.ask_base_asset_reserve, 4672813088646692);
1220+
assert_eq!(perp_market.amm.bid_base_asset_reserve, 4672004879737647);
1221+
assert_eq!(perp_market.amm.ask_base_asset_reserve, 4669662283322685);
12101222

12111223
crate::validation::perp_market::validate_perp_market(&perp_market).unwrap();
12121224

@@ -1233,10 +1245,10 @@ fn amm_perp_ref_offset() {
12331245
.amm
12341246
.bid_ask_price(reserve_price_mm_offset)
12351247
.unwrap();
1236-
assert_eq!(perp_market.amm.reference_price_offset, 133);
1248+
assert_eq!(perp_market.amm.reference_price_offset, 1462);
12371249
assert_eq!(reserve_price_mm_offset, 7137107);
1238-
assert_eq!(b2, 7101549);
1239-
assert_eq!(a2, 7174591);
1250+
assert_eq!(b2, 7111035);
1251+
assert_eq!(a2, 7184076);
12401252

12411253
// Uses the original oracle if the slot is old, ignoring MM oracle
12421254
perp_market.amm.mm_oracle_price = mm_oracle_price_data.get_price() * 995 / 1000;
@@ -1256,8 +1268,8 @@ fn amm_perp_ref_offset() {
12561268
.bid_ask_price(reserve_price_mm_offset_3)
12571269
.unwrap();
12581270
assert_eq!(reserve_price_mm_offset_3, r);
1259-
assert_eq!(b3, 7066225);
1260-
assert_eq!(a3, 7138903);
1271+
assert_eq!(b3, 7075820);
1272+
assert_eq!(a3, 7148497);
12611273
}
12621274

12631275
#[test]

programs/drift/src/math/amm_spread.rs

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ use crate::math::constants::{
1111
AMM_TIMES_PEG_TO_QUOTE_PRECISION_RATIO_I128, AMM_TO_QUOTE_PRECISION_RATIO_I128,
1212
BID_ASK_SPREAD_PRECISION, BID_ASK_SPREAD_PRECISION_I128, DEFAULT_LARGE_BID_ASK_FACTOR,
1313
DEFAULT_REVENUE_SINCE_LAST_FUNDING_SPREAD_RETREAT, FUNDING_RATE_BUFFER,
14-
MAX_BID_ASK_INVENTORY_SKEW_FACTOR, PEG_PRECISION, PERCENTAGE_PRECISION,
15-
PERCENTAGE_PRECISION_I128, PERCENTAGE_PRECISION_U64, PRICE_PRECISION, PRICE_PRECISION_I128,
16-
PRICE_PRECISION_I64,
14+
FUNDING_RATE_OFFSET_DENOMINATOR, MAX_BID_ASK_INVENTORY_SKEW_FACTOR, PEG_PRECISION,
15+
PERCENTAGE_PRECISION, PERCENTAGE_PRECISION_I128, PERCENTAGE_PRECISION_U64, PRICE_PRECISION,
16+
PRICE_PRECISION_I128, PRICE_PRECISION_I64,
1717
};
1818
use crate::math::safe_math::SafeMath;
1919
use crate::state::perp_market::{ContractType, PerpMarket, AMM};
@@ -620,9 +620,13 @@ pub fn calculate_reference_price_offset(
620620
let mark_premium_day: i64 = last_24h_avg_funding_rate
621621
.safe_div(FUNDING_RATE_BUFFER.cast()?)?
622622
.safe_mul(24)?
623+
.safe_sub(
624+
oracle_twap_slow
625+
.abs()
626+
.safe_div(FUNDING_RATE_OFFSET_DENOMINATOR)?,
627+
)?
623628
.clamp(-max_offset_in_price, max_offset_in_price); // todo: look at how 24h funding is calc w.r.t. the funding_period
624-
625-
// take average clamped premium as the price-based offset
629+
// take average clamped premium as the price-based offset
626630
let mark_premium_avg = mark_premium_minute
627631
.safe_add(mark_premium_hour)?
628632
.safe_add(mark_premium_day)?
@@ -632,17 +636,13 @@ pub fn calculate_reference_price_offset(
632636
.safe_mul(PRICE_PRECISION_I64)?
633637
.safe_div(reserve_price.cast()?)?;
634638

635-
let inventory_pct = liquidity_fraction
636-
.cast::<i64>()?
637-
.safe_mul(max_offset_pct)?
638-
.safe_div(PERCENTAGE_PRECISION.cast::<i64>()?)?
639-
.clamp(-max_offset_pct, max_offset_pct);
640-
641639
// only apply when inventory is consistent with recent and 24h market premium
642-
let offset_pct = if (mark_premium_avg_pct >= 0 && inventory_pct >= 0)
643-
|| (mark_premium_avg_pct <= 0 && inventory_pct <= 0)
640+
let offset_pct = if (mark_premium_avg_pct >= 0 && liquidity_fraction >= 0)
641+
|| (mark_premium_avg_pct <= 0 && liquidity_fraction <= 0)
644642
{
645-
mark_premium_avg_pct.safe_add(inventory_pct)?
643+
mark_premium_avg_pct
644+
.safe_mul(liquidity_fraction.unsigned_abs().cast::<i64>()?)?
645+
.safe_div(2)?
646646
} else {
647647
0
648648
};

0 commit comments

Comments
 (0)