code.vegaprotocol.io/vega@v0.79.0/core/integration/features/amm/reduce-only-single-sided.feature (about) 1 Feature: Cover more complex scenarios. 2 3 Background: 4 Given the average block duration is "1" 5 And the margin calculator named "margin-calculator-1": 6 | search factor | initial factor | release factor | 7 | 1.2 | 1.5 | 1.7 | 8 And the log normal risk model named "log-normal-risk-model": 9 | risk aversion | tau | mu | r | sigma | 10 | 0.001 | 0.0011407711613050422 | 0 | 0.9 | 3.0 | 11 And the liquidity monitoring parameters: 12 | name | triggering ratio | time window | scaling factor | 13 | lqm-params | 1.00 | 20s | 1 | 14 15 And the following network parameters are set: 16 | name | value | 17 | market.value.windowLength | 60s | 18 | network.markPriceUpdateMaximumFrequency | 2s | 19 | limits.markets.maxPeggedOrders | 6 | 20 | market.auction.minimumDuration | 1 | 21 | market.fee.factors.infrastructureFee | 0.001 | 22 | market.fee.factors.makerFee | 0.004 | 23 | spam.protection.max.stopOrdersPerMarket | 5 | 24 | market.liquidity.equityLikeShareFeeFraction | 1 | 25 | market.amm.minCommitmentQuantum | 1 | 26 | market.liquidity.bondPenaltyParameter | 0.2 | 27 | market.liquidity.stakeToCcyVolume | 1 | 28 | market.liquidity.successorLaunchWindowLength | 1h | 29 | market.liquidity.sla.nonPerformanceBondPenaltySlope | 0.1 | 30 | market.liquidity.sla.nonPerformanceBondPenaltyMax | 0.6 | 31 | validators.epoch.length | 10s | 32 | market.liquidity.earlyExitPenalty | 0.25 | 33 | market.liquidity.maximumLiquidityFeeFactorLevel | 0.25 | 34 #risk factor short:3.5569036 35 #risk factor long:0.801225765 36 And the following assets are registered: 37 | id | decimal places | 38 | USD | 0 | 39 And the fees configuration named "fees-config-1": 40 | maker fee | infrastructure fee | 41 | 0.0004 | 0.001 | 42 43 And the liquidity sla params named "SLA-22": 44 | price range | commitment min time fraction | performance hysteresis epochs | sla competition factor | 45 | 0.5 | 0.6 | 1 | 1.0 | 46 47 And the markets: 48 | id | quote name | asset | liquidity monitoring | risk model | margin calculator | auction duration | fees | price monitoring | data source config | linear slippage factor | quadratic slippage factor | sla params | 49 | ETH/MAR22 | USD | USD | lqm-params | log-normal-risk-model | margin-calculator-1 | 2 | fees-config-1 | default-none | default-eth-for-future | 1e0 | 0 | SLA-22 | 50 51 # Setting up the accounts and vAMM submission now is part of the background, because we'll be running scenarios 0090-VAMM-006 through 0090-VAMM-014 on this setup 52 Given the parties deposit on asset's general account the following amount: 53 | party | asset | amount | 54 | lp1 | USD | 1000000 | 55 | lp2 | USD | 1000000 | 56 | lp3 | USD | 1000000 | 57 | party1 | USD | 1000000 | 58 | party2 | USD | 1000000 | 59 | party3 | USD | 1000000 | 60 | party4 | USD | 1000000 | 61 | party5 | USD | 1000000 | 62 | vamm1 | USD | 1000000 | 63 64 When the parties submit the following liquidity provision: 65 | id | party | market id | commitment amount | fee | lp type | 66 | lp_1 | lp1 | ETH/MAR22 | 600 | 0.02 | submission | 67 | lp_2 | lp2 | ETH/MAR22 | 400 | 0.015 | submission | 68 Then the network moves ahead "4" blocks 69 And the current epoch is "0" 70 71 And the parties place the following orders: 72 | party | market id | side | volume | price | resulting trades | type | tif | reference | 73 | lp1 | ETH/MAR22 | buy | 20 | 40 | 0 | TYPE_LIMIT | TIF_GTC | lp1-b | 74 | party1 | ETH/MAR22 | buy | 1 | 100 | 0 | TYPE_LIMIT | TIF_GTC | | 75 | party2 | ETH/MAR22 | sell | 1 | 100 | 0 | TYPE_LIMIT | TIF_GTC | | 76 | lp1 | ETH/MAR22 | sell | 10 | 160 | 0 | TYPE_LIMIT | TIF_GTC | lp1-s | 77 When the opening auction period ends for market "ETH/MAR22" 78 Then the following trades should be executed: 79 | buyer | price | size | seller | 80 | party1 | 100 | 1 | party2 | 81 82 And the market data for the market "ETH/MAR22" should be: 83 | mark price | trading mode | target stake | supplied stake | open interest | ref price | mid price | static mid price | 84 | 100 | TRADING_MODE_CONTINUOUS | 39 | 1000 | 1 | 100 | 100 | 100 | 85 When the parties submit the following AMM: 86 | party | market id | amount | slippage | base | lower bound | upper bound | lower leverage | upper leverage | proposed fee | 87 | vamm1 | ETH/MAR22 | 100000 | 0.1 | 100 | 85 | 150 | 4 | 4 | 0.01 | 88 Then the AMM pool status should be: 89 | party | market id | amount | status | base | lower bound | upper bound | lower leverage | upper leverage | 90 | vamm1 | ETH/MAR22 | 100000 | STATUS_ACTIVE | 100 | 85 | 150 | 4 | 4 | 91 92 And set the following AMM sub account aliases: 93 | party | market id | alias | 94 | vamm1 | ETH/MAR22 | vamm1-id | 95 And the following transfers should happen: 96 | from | from account | to | to account | market id | amount | asset | is amm | type | 97 | vamm1 | ACCOUNT_TYPE_GENERAL | vamm1-id | ACCOUNT_TYPE_GENERAL | | 100000 | USD | true | TRANSFER_TYPE_AMM_LOW | 98 99 100 @VAMM 101 Scenario: 0090-VAMM-020: If a vAMM is cancelled and set in Reduce-Only mode when it is currently long, then It creates no further buy orders even if the current price is above the configured lower price. When one of it's sell orders is executed it still does not produce buy orders, and correctly quotes sell orders from a higher price. When the position reaches 0 the vAMM is closed and all funds are released to the user after the next mark to market. 102 When the parties place the following orders: 103 | party | market id | side | volume | price | resulting trades | type | tif | 104 | party4 | ETH/MAR22 | sell | 350 | 90 | 1 | TYPE_LIMIT | TIF_GTC | 105 # see the trades that make the vAMM go long 106 Then the following trades should be executed: 107 | buyer | price | size | seller | is amm | 108 | vamm1-id | 95 | 350 | party4 | true | 109 # move ahead until MTM settlement occurs 110 And the network moves ahead "3" blocks 111 Then the market data for the market "ETH/MAR22" should be: 112 | mark price | trading mode | mid price | static mid price | 113 | 95 | TRADING_MODE_CONTINUOUS | 90 | 90 | 114 Then the parties should have the following profit and loss: 115 | party | volume | unrealised pnl | realised pnl | is amm | 116 | party4 | -350 | 0 | 0 | | 117 | vamm1-id | 350 | 0 | 0 | true | 118 And the following transfers should happen: 119 | from | from account | to | to account | market id | amount | asset | is amm | type | 120 | | ACCOUNT_TYPE_FEES_MAKER | vamm1-id | ACCOUNT_TYPE_GENERAL | ETH/MAR22 | 133 | USD | true | TRANSFER_TYPE_MAKER_FEE_RECEIVE | 121 | vamm1-id | ACCOUNT_TYPE_GENERAL | vamm1-id | ACCOUNT_TYPE_MARGIN | ETH/MAR22 | 64462 | USD | true | TRANSFER_TYPE_MARGIN_LOW | 122 And the parties should have the following account balances: 123 | party | asset | market id | general | margin | is amm | 124 | vamm1 | USD | | 900000 | | | 125 | vamm1-id | USD | ETH/MAR22 | 35671 | 64462 | true | 126 And the market data for the market "ETH/MAR22" should be: 127 | mark price | trading mode | mid price | static mid price | best offer price | best bid price | 128 | 95 | TRADING_MODE_CONTINUOUS | 90 | 90 | 91 | 89 | 129 130 # Next: cancel the vAMM with reduce-only 131 When the parties cancel the following AMM: 132 | party | market id | method | 133 | vamm1 | ETH/MAR22 | METHOD_REDUCE_ONLY | 134 Then the AMM pool status should be: 135 | party | market id | amount | status | base | lower bound | upper bound | lower leverage | upper leverage | 136 | vamm1 | ETH/MAR22 | 100000 | STATUS_REDUCE_ONLY | 100 | 85 | 150 | 4 | 4 | 137 # Check if the vAMM doesn't place any more buy orders: submit sell orders at previous best bid, ask, and mid prices: 138 When the parties place the following orders: 139 | party | market id | side | volume | price | resulting trades | type | tif | 140 | party4 | ETH/MAR22 | sell | 10 | 89 | 0 | TYPE_LIMIT | TIF_GTC | 141 | party4 | ETH/MAR22 | sell | 10 | 90 | 0 | TYPE_LIMIT | TIF_GTC | 142 | party4 | ETH/MAR22 | sell | 10 | 91 | 0 | TYPE_LIMIT | TIF_GTC | 143 Then the market data for the market "ETH/MAR22" should be: 144 | mark price | trading mode | mid price | static mid price | best offer price | best bid price | 145 | 95 | TRADING_MODE_CONTINUOUS | 64 | 64 | 89 | 40 | 146 147 # Now start checking if the vAMM still quotes sell orders 148 When the parties place the following orders: 149 | party | market id | side | volume | price | resulting trades | type | tif | 150 | party5 | ETH/MAR22 | buy | 280 | 110 | 5 | TYPE_LIMIT | TIF_GTC | 151 Then the following trades should be executed: 152 | buyer | price | size | seller | is amm | 153 | party5 | 89 | 10 | party4 | | 154 | party5 | 90 | 10 | party4 | | 155 | party5 | 90 | 19 | vamm1-id | true | 156 | party5 | 91 | 10 | party4 | | 157 | party5 | 90 | 19 | vamm1-id | true | 158 | party5 | 94 | 231 | vamm1-id | true | 159 160 # check the state of the market, trigger MTM settlement and check balances before closing out the last 100 for the vAMM 161 When the network moves ahead "2" blocks 162 Then the parties should have the following profit and loss: 163 | party | volume | unrealised pnl | realised pnl | is amm | 164 | party4 | -380 | 230 | 0 | | 165 | party5 | 280 | 196 | 0 | | 166 | vamm1-id | 100 | -100 | -326 | true | 167 # vAMM is still quoting bid price, though it is in reduce-only mode, and therefore doesn't place those orders. 168 # The best bid should be 40 here? 169 And the market data for the market "ETH/MAR22" should be: 170 | mark price | trading mode | mid price | static mid price | best offer price | best bid price | 171 | 94 | TRADING_MODE_CONTINUOUS | 69 | 69 | 98 | 40 | 172 # vAMM receives some fees, but pays MTM loss, excess margin is released 173 And the following transfers should happen: 174 | from | from account | to | to account | market id | amount | asset | is amm | type | 175 | | ACCOUNT_TYPE_FEES_MAKER | vamm1-id | ACCOUNT_TYPE_GENERAL | ETH/MAR22 | 87 | USD | true | TRANSFER_TYPE_MAKER_FEE_RECEIVE | 176 | vamm1-id | ACCOUNT_TYPE_MARGIN | | ACCOUNT_TYPE_SETTLEMENT | ETH/MAR22 | 426 | USD | true | TRANSFER_TYPE_MTM_LOSS | 177 | vamm1-id | ACCOUNT_TYPE_MARGIN | vamm1-id | ACCOUNT_TYPE_GENERAL | ETH/MAR22 | 45811 | USD | true | TRANSFER_TYPE_MARGIN_HIGH | 178 # After receiving fees, and excess margin is correctly released, the balances of the vAMM sub-accounts match the position: 179 And the parties should have the following account balances: 180 | party | asset | market id | general | margin | is amm | 181 | vamm1 | USD | | 900000 | | | 182 | vamm1-id | USD | ETH/MAR22 | 81576 | 18225 | true | 183 184 # Now make sure the vAMM, though clearly having sufficient balance to increase its position, still doesn't place any buy orders (reduce only check 2) 185 # Like before, place orders at mid, offer, and bid prices 186 When the parties place the following orders: 187 | party | market id | side | volume | price | resulting trades | type | tif | reference | 188 | party4 | ETH/MAR22 | sell | 10 | 96 | 0 | TYPE_LIMIT | TIF_GTC | p4-c1 | 189 | party4 | ETH/MAR22 | sell | 10 | 97 | 0 | TYPE_LIMIT | TIF_GTC | p4-c2 | 190 | party4 | ETH/MAR22 | sell | 10 | 98 | 0 | TYPE_LIMIT | TIF_GTC | p4-c3 | 191 # we've confirmed the vAMM does not reduce its position at all, so cancel these orders to keep things simple 192 Then the parties cancel the following orders: 193 | party | reference | 194 | party4 | p4-c1 | 195 | party4 | p4-c2 | 196 | party4 | p4-c3 | 197 # party5 places a buy order large enough to trade with party4 and reduce the vAMM position down to 0, and no more. 198 # we'll do a v2 of this test where this buy order is "over-sized" to ensure the vAMM doesn't flip from long to short. 199 And the parties place the following orders with ticks: 200 | party | market id | side | volume | price | resulting trades | type | tif | 201 | party5 | ETH/MAR22 | buy | 100 | 110 | 1 | TYPE_LIMIT | TIF_GTC | 202 Then the following trades should be executed: 203 | buyer | price | size | seller | is amm | 204 | party5 | 98 | 100 | vamm1-id | true | 205 # Confirm the vAMM is no longer quoting anything 206 And the market data for the market "ETH/MAR22" should be: 207 | mark price | trading mode | mid price | static mid price | best offer price | best bid price | 208 | 94 | TRADING_MODE_CONTINUOUS | 100 | 100 | 160 | 40 | 209 And the AMM pool status should be: 210 | party | market id | amount | status | base | lower bound | upper bound | lower leverage | upper leverage | 211 | vamm1 | ETH/MAR22 | 100000 | STATUS_REDUCE_ONLY | 100 | 85 | 150 | 4 | 4 | 212 And the parties place the following orders with ticks: 213 | party | market id | side | volume | price | resulting trades | type | tif | reference | 214 | party5 | ETH/MAR22 | buy | 1 | 110 | 0 | TYPE_LIMIT | TIF_GTC | p5-check-ref | 215 216 # Move 1 block, the status still shows reduce only, although the position is closed (so it should be cancelled) 217 # apparently we need to MTM before setting the AMM to cancelled. What happens if we submit more orders, though? 218 When the network moves ahead "1" blocks 219 Then the AMM pool status should be: 220 | party | market id | amount | status | base | lower bound | upper bound | lower leverage | upper leverage | 221 | vamm1 | ETH/MAR22 | 100000 | STATUS_REDUCE_ONLY | 100 | 85 | 150 | 4 | 4 | 222 And the market data for the market "ETH/MAR22" should be: 223 | mark price | trading mode | mid price | static mid price | best offer price | best bid price | 224 | 94 | TRADING_MODE_CONTINUOUS | 135 | 135 | 160 | 110 | 225 226 When the parties cancel the following orders: 227 | party | reference | 228 | party5 | p5-check-ref | 229 Then the market data for the market "ETH/MAR22" should be: 230 | mark price | trading mode | mid price | static mid price | best offer price | best bid price | 231 | 94 | TRADING_MODE_CONTINUOUS | 100 | 100 | 160 | 40 | 232 233 # Now move ahead 1 more block, we should now perform the MTM settlement 234 # Check the final PnL for the vAMM, check the transfers and balances 235 When the network moves ahead "1" blocks 236 Then the parties should have the following profit and loss: 237 | party | volume | unrealised pnl | realised pnl | is amm | 238 | party4 | -380 | -1290 | 0 | | 239 | party5 | 380 | 1316 | 0 | | 240 | vamm1-id | 0 | 0 | -26 | true | 241 And the AMM pool status should be: 242 | party | market id | amount | status | base | lower bound | upper bound | lower leverage | upper leverage | 243 | vamm1 | ETH/MAR22 | 100000 | STATUS_CANCELLED | 100 | 85 | 150 | 4 | 4 | 244 And the market data for the market "ETH/MAR22" should be: 245 | mark price | trading mode | mid price | static mid price | best offer price | best bid price | 246 | 98 | TRADING_MODE_CONTINUOUS | 100 | 100 | 160 | 40 | 247 And the following transfers should happen: 248 | from | from account | to | to account | market id | amount | asset | is amm | type | 249 | | ACCOUNT_TYPE_FEES_MAKER | vamm1-id | ACCOUNT_TYPE_GENERAL | ETH/MAR22 | 40 | USD | true | TRANSFER_TYPE_MAKER_FEE_RECEIVE | 250 | | ACCOUNT_TYPE_SETTLEMENT | vamm1-id | ACCOUNT_TYPE_MARGIN | ETH/MAR22 | 400 | USD | true | TRANSFER_TYPE_MTM_WIN | 251 | vamm1-id | ACCOUNT_TYPE_MARGIN | vamm1-id | ACCOUNT_TYPE_GENERAL | ETH/MAR22 | 18625 | USD | true | TRANSFER_TYPE_MARGIN_HIGH | 252 | vamm1-id | ACCOUNT_TYPE_GENERAL | vamm1 | ACCOUNT_TYPE_GENERAL | ETH/MAR22 | 100241 | USD | true | TRANSFER_TYPE_AMM_RELEASE | 253 And the parties should have the following account balances: 254 | party | asset | market id | general | margin | is amm | 255 | vamm1 | USD | | 1000241 | | | 256 | vamm1-id | USD | ETH/MAR22 | 0 | 0 | true | 257 258