55from hypothesis import given , strategies as st , assume , settings , reproduce_failure
66from mpmath import mp , mpf
77import os
8-
98os .chdir ('../..' )
109
11- from hydradx .model import run , processing
10+ from hydradx .model import run
1211from hydradx .model .amm import omnipool_amm as oamm
1312from hydradx .model .amm .agents import Agent
1413from hydradx .model .amm .global_state import GlobalState
1514from hydradx .model .amm .omnipool_amm import DynamicFee , OmnipoolState , OmnipoolLiquidityPosition
1615from hydradx .model .amm .trade_strategies import constant_swaps , omnipool_arbitrage
1716from hydradx .tests .strategies_omnipool import omnipool_reasonable_config , omnipool_config , assets_config
18- import hydradx .model .production_settings as production_settings
1917
2018mp .dps = 50
2119
2725fee_strategy = st .floats (min_value = 0.0001 , max_value = 0.1 , allow_nan = False , allow_infinity = False )
2826
2927
30- @given (omnipool_config (asset_fee = 0 , lrna_fee = 0 , token_count = 3 ), asset_quantity_strategy )
31- def test_swap_lrna_delta_Qi_respects_invariant (d : oamm .OmnipoolState , delta_ri : float ):
32- i = d .asset_list [- 1 ]
33- assume (i in d .asset_list )
34- assume (d .liquidity [i ] > delta_ri > - d .liquidity [i ])
35- d2 = copy .deepcopy (d )
36- delta_Qi = oamm .swap_lrna_delta_Qi (d , delta_ri , i )
37- d2 .liquidity [i ] += delta_ri
38- d2 .lrna [i ] += delta_Qi
39-
40- # Test basics
41- for j in d2 .liquidity :
42- assert d2 .liquidity [j ] > 0
43- assert d2 .lrna [j ] > 0
44- assert not (delta_ri > 0 and delta_Qi > 0 )
45- assert not (delta_ri < 0 and delta_Qi < 0 )
46-
47- # Test that the pool invariant is respected
48- assert oamm .asset_invariant (d2 , i ) == pytest .approx (oamm .asset_invariant (d , i ))
49-
50-
51- @given (omnipool_config (asset_fee = 0 , lrna_fee = 0 , token_count = 3 ), asset_quantity_strategy )
52- def test_swap_lrna_delta_Ri_respects_invariant (d : oamm .OmnipoolState , delta_qi : float ):
53- i = d .asset_list [- 1 ]
54- assume (i in d .asset_list )
55- assume (d .lrna [i ] > delta_qi > - d .lrna [i ])
56- d2 = copy .deepcopy (d )
57- delta_Ri = oamm .swap_lrna_delta_Ri (d , delta_qi , i )
58- d2 .lrna [i ] += delta_qi
59- d2 .liquidity [i ] += delta_Ri
60-
61- # Test basics
62- for j in d .liquidity :
63- assert d2 .liquidity [j ] > 0
64- assert d2 .lrna [j ] > 0
65- assert not (delta_Ri > 0 and delta_qi > 0 )
66- assert not (delta_Ri < 0 and delta_qi < 0 )
67-
68- # Test that the pool invariant is respected
69- assert oamm .asset_invariant (d2 , i ) == pytest .approx (oamm .asset_invariant (d , i ))
70-
28+ def asset_invariant (state : oamm .OmnipoolState , tkn : str ):
29+ return state .liquidity [tkn ] * state .lrna [tkn ]
7130
7231@given (omnipool_config ())
7332def test_sell_accuracy (initial_state ):
@@ -88,14 +47,6 @@ def test_sell_accuracy(initial_state):
8847 raise AssertionError ('Asset sold is wrong.' )
8948
9049
91- @given (omnipool_config (asset_fee = 0 , lrna_fee = 0 ))
92- def test_weights (initial_state : oamm .OmnipoolState ):
93- old_state = initial_state
94- for i in old_state .liquidity :
95- assert oamm .weight_i (old_state , i ) >= 0
96- assert sum ([oamm .weight_i (old_state , i ) for i in old_state .liquidity ]) == pytest .approx (1.0 )
97-
98-
9950@given (omnipool_config ())
10051def test_prices (market_state : oamm .OmnipoolState ):
10152 for i in market_state .asset_list :
@@ -694,12 +645,13 @@ def test_swap_lrna(delta_qa: float, buy_index: int):
694645 tkn_buy = i ,
695646 tkn_sell = 'LRNA'
696647 )
697- if oamm .asset_invariant (feeless_swap_state , i ) != pytest .approx (oamm .asset_invariant (old_state , i )):
648+
649+ if asset_invariant (feeless_swap_state , i ) != pytest .approx (asset_invariant (old_state , i )):
698650 raise AssertionError ('Invariant not respected in feeless trade.' )
699651 for j in old_state .liquidity :
700652 if min (new_state .liquidity [j ] - feeless_swap_state .liquidity [j ], 0 ) != pytest .approx (0 ):
701653 raise AssertionError ('Liquidity decreased.' )
702- if min (oamm . asset_invariant (new_state , i ) / oamm . asset_invariant (old_state , i ), 1 ) != pytest .approx (1 ):
654+ if min (asset_invariant (new_state , i ) / asset_invariant (old_state , i ), 1 ) != pytest .approx (1 ):
703655 raise AssertionError ('Invariant decreased.' )
704656
705657 delta_qi = new_state .lrna [i ] - old_state .lrna [i ]
@@ -1111,7 +1063,7 @@ def test_swap_assets(initial_state: oamm.OmnipoolState, i):
11111063 if min (new_state .liquidity [j ] - asset_fee_only_state .liquidity [j ], 0 ) != pytest .approx (0 ):
11121064 raise AssertionError ("asset in pool {j} is lesser when LRNA fee is added vs only asset fee" )
11131065 # invariant does not decrease
1114- if min (oamm . asset_invariant (new_state , j ) / oamm . asset_invariant (old_state , j ), 1 ) != pytest .approx (1 ):
1066+ if min (asset_invariant (new_state , j ) / asset_invariant (old_state , j ), 1 ) != pytest .approx (1 ):
11151067 raise AssertionError ("invariant ratio less than zero" )
11161068 # total quantity of R_i remains unchanged
11171069 if (old_state .liquidity [j ] + old_agent .holdings [j ]
@@ -2637,6 +2589,7 @@ def test_lrna_split_sell_calculation():
26372589 asset_fee = mpf (1 ) / 400 , # 0.0025
26382590 slip_factor = mpf (1.0 )
26392591 )
2592+
26402593 output_1 = list (omnipool .calculate_out_given_in (tkn_buy = "LRNA" , tkn_sell = "HDX" , sell_quantity = 1000 ))
26412594 outputs = [
26422595 output_1 ,
0 commit comments