From 196ba788066fe027553140fbd7880d1f94790136 Mon Sep 17 00:00:00 2001 From: Ben Date: Wed, 21 Feb 2024 13:22:48 +0000 Subject: [PATCH] chore(trading): refactor tests (#5835) --- apps/trading/e2e/tests/fees/fees_test_ids.py | 60 ++ apps/trading/e2e/tests/fees/test_fees.py | 689 ------------------ .../e2e/tests/fees/test_fees_combo_tier_2.py | 216 ++++++ .../test_fees_referral_discount_tier_1.py | 221 ++++++ .../test_fees_referral_discount_tier_2.py | 222 ++++++ .../fees/test_fees_volume_discount_tier_1.py | 210 ++++++ .../fees/test_fees_volume_discount_tier_2.py | 209 ++++++ .../e2e/tests/get_started/test_get_started.py | 9 +- .../test_liquidity_provision.py | 2 +- .../e2e/tests/market/test_closed_markets.py | 2 +- .../e2e/tests/market/test_market_info.py | 2 +- .../e2e/tests/market/test_markets_proposed.py | 2 +- ...itoring_auction_price_volatility_market.py | 2 +- .../e2e/tests/navigation/test_navigation.py | 3 +- .../e2e/tests/orderbook/test_orderbook.py | 2 +- .../tests/perpetual_market/test_perpetuals.py | 2 +- .../e2e/tests/positions/test_collateral.py | 2 +- .../e2e/tests/referrals/test_referrals.py | 2 +- .../e2e/tests/rewards/rewards_test_ids.py | 62 ++ .../e2e/tests/rewards/test_hoarder_tier_0.py | 121 +++ .../e2e/tests/rewards/test_hoarder_tier_1.py | 173 +++++ .../trading/e2e/tests/rewards/test_rewards.py | 475 ------------ .../rewards/test_rewards_activity_tier_0.py | 77 +- .../rewards/test_rewards_activity_tier_1.py | 187 +++++ .../rewards/test_rewards_combo_tier_1.py | 174 +++++ .../trading/e2e/tests/rewards/test_vesting.py | 1 + .../e2e/tests/settings/test_settings.py | 2 +- apps/trading/e2e/tests/teams/test_teams.py | 2 +- 28 files changed, 1889 insertions(+), 1242 deletions(-) create mode 100644 apps/trading/e2e/tests/fees/fees_test_ids.py delete mode 100644 apps/trading/e2e/tests/fees/test_fees.py create mode 100644 apps/trading/e2e/tests/fees/test_fees_combo_tier_2.py create mode 100644 apps/trading/e2e/tests/fees/test_fees_referral_discount_tier_1.py create mode 100644 apps/trading/e2e/tests/fees/test_fees_referral_discount_tier_2.py create mode 100644 apps/trading/e2e/tests/fees/test_fees_volume_discount_tier_1.py create mode 100644 apps/trading/e2e/tests/fees/test_fees_volume_discount_tier_2.py create mode 100644 apps/trading/e2e/tests/rewards/rewards_test_ids.py create mode 100644 apps/trading/e2e/tests/rewards/test_hoarder_tier_0.py create mode 100644 apps/trading/e2e/tests/rewards/test_hoarder_tier_1.py delete mode 100644 apps/trading/e2e/tests/rewards/test_rewards.py create mode 100644 apps/trading/e2e/tests/rewards/test_rewards_activity_tier_1.py create mode 100644 apps/trading/e2e/tests/rewards/test_rewards_combo_tier_1.py diff --git a/apps/trading/e2e/tests/fees/fees_test_ids.py b/apps/trading/e2e/tests/fees/fees_test_ids.py new file mode 100644 index 000000000..238c52645 --- /dev/null +++ b/apps/trading/e2e/tests/fees/fees_test_ids.py @@ -0,0 +1,60 @@ +# test_ids.py + +# Constants for test IDs +ADJUSTED_FEES = "adjusted-fees" +TOTAL_FEE_BEFORE_DISCOUNT = "total-fee-before-discount" +INFRASTRUCTURE_FEES = "infrastructure-fees" +MAKER_FEES = "maker-fees" +LIQUIDITY_FEES = "liquidity-fees" +TOTAL_DISCOUNT = "total-discount" +VOLUME_DISCOUNT_ROW = "volume-discount-row" +REFERRAL_DISCOUNT_ROW = "referral-discount-row" +PAST_EPOCHS_VOLUME = "past-epochs-volume" +REQUIRED_FOR_NEXT_TIER = "required-for-next-tier" +TIER_VALUE_0 = "tier-value-0" +TIER_VALUE_1 = "tier-value-1" +DISCOUNT_VALUE_0 = "discount-value-0" +DISCOUNT_VALUE_1 = "discount-value-1" +MIN_VOLUME_VALUE_0 = "min-volume-value-0" +MIN_VOLUME_VALUE_1 = "min-volume-value-1" +MY_VOLUME_VALUE_0 = "my-volume-value-0" +MY_VOLUME_VALUE_1 = "my-volume-value-1" +ORDER_SIZE = "order-size" +ORDER_PRICE = "order-price" +DISCOUNT_PILL = "discount-pill" +FEES_TEXT = "fees-text" +TOOLTIP_CONTENT = "tooltip-content" +INFRASTRUCTURE_FEE_FACTOR = "infrastructure-fee-factor" +INFRASTRUCTURE_FEE_VALUE = "infrastructure-fee-value" +LIQUIDITY_FEE_FACTOR = "liquidity-fee-factor" +LIQUIDITY_FEE_VALUE = "liquidity-fee-value" +MAKER_FEE_FACTOR = "maker-fee-factor" +MAKER_FEE_VALUE = "maker-fee-value" +SUBTOTAL_FEE_FACTOR = "subtotal-fee-factor" +SUBTOTAL_FEE_VALUE = "subtotal-fee-value" +DISCOUNT_FEE_FACTOR = "discount-fee-factor" +DISCOUNT_FEE_VALUE = "discount-fee-value" +TOTAL_FEE_VALUE = "total-fee-value" +RUNNING_NOTIONAL_TAKER_VOLUME = "running-notional-taker-volume" +EPOCHS_IN_REFERRAL_SET = "epochs-in-referral-set" +REQUIRED_EPOCHS_VALUE_0 = "required-epochs-value-0" +REQUIRED_EPOCHS_VALUE_1 = "required-epochs-value-1" +FILLS = "Fills" +TAB_FILLS = "tab-fills" +FEE_BREAKDOWN_TOOLTIP = "fee-breakdown-tooltip" +PINNED_ROW_LOCATOR = ".ag-pinned-left-cols-container .ag-row" +ROW_LOCATOR = ".ag-center-cols-container .ag-row" +# Col-Ids: +COL_INSTRUMENT_CODE = '[data-testid="market-code"]' +COL_CODE = '[col-id="code"]' +COL_SIZE = '[col-id="size"]' +COL_PRICE = '[col-id="price"]' +COL_PRICE_1 = '[col-id="price_1"]' +COL_AGGRESSOR = '[col-id="aggressor"]' +COL_FEE = '[col-id="fee"]' +COL_FEE_DISCOUNT = '[col-id="fee-discount"]' +COL_FEE_AFTER_DISCOUNT = '[col-id="feeAfterDiscount"]' +COL_INFRA_FEE = '[col-id="infraFee"]' +COL_MAKER_FEE = '[col-id="makerFee"]' +COL_LIQUIDITY_FEE = '[col-id="liquidityFee"]' +COL_TOTAL_FEE = '[col-id="totalFee"]' diff --git a/apps/trading/e2e/tests/fees/test_fees.py b/apps/trading/e2e/tests/fees/test_fees.py deleted file mode 100644 index f6bd79a75..000000000 --- a/apps/trading/e2e/tests/fees/test_fees.py +++ /dev/null @@ -1,689 +0,0 @@ -import pytest - -from playwright.sync_api import Page, expect -from vega_sim.null_service import VegaServiceNull -from actions.vega import submit_order -from wallet_config import MM_WALLET -from conftest import init_vega, init_page, auth_setup, cleanup_container -from actions.utils import next_epoch, change_keys, forward_time -from fixtures.market import market_exists, setup_continuous_market - -# region Constants for test IDs -ADJUSTED_FEES = "adjusted-fees" -TOTAL_FEE_BEFORE_DISCOUNT = "total-fee-before-discount" -INFRASTRUCTURE_FEES = "infrastructure-fees" -MAKER_FEES = "maker-fees" -LIQUIDITY_FEES = "liquidity-fees" -TOTAL_DISCOUNT = "total-discount" -VOLUME_DISCOUNT_ROW = "volume-discount-row" -REFERRAL_DISCOUNT_ROW = "referral-discount-row" -PAST_EPOCHS_VOLUME = "past-epochs-volume" -REQUIRED_FOR_NEXT_TIER = "required-for-next-tier" -TIER_VALUE_0 = "tier-value-0" -TIER_VALUE_1 = "tier-value-1" -DISCOUNT_VALUE_0 = "discount-value-0" -DISCOUNT_VALUE_1 = "discount-value-1" -MIN_VOLUME_VALUE_0 = "min-volume-value-0" -MIN_VOLUME_VALUE_1 = "min-volume-value-1" -MY_VOLUME_VALUE_0 = "my-volume-value-0" -MY_VOLUME_VALUE_1 = "my-volume-value-1" -ORDER_SIZE = "order-size" -ORDER_PRICE = "order-price" -DISCOUNT_PILL = "discount-pill" -FEES_TEXT = "fees-text" -TOOLTIP_CONTENT = "tooltip-content" -INFRASTRUCTURE_FEE_FACTOR = "infrastructure-fee-factor" -INFRASTRUCTURE_FEE_VALUE = "infrastructure-fee-value" -LIQUIDITY_FEE_FACTOR = "liquidity-fee-factor" -LIQUIDITY_FEE_VALUE = "liquidity-fee-value" -MAKER_FEE_FACTOR = "maker-fee-factor" -MAKER_FEE_VALUE = "maker-fee-value" -SUBTOTAL_FEE_FACTOR = "subtotal-fee-factor" -SUBTOTAL_FEE_VALUE = "subtotal-fee-value" -DISCOUNT_FEE_FACTOR = "discount-fee-factor" -DISCOUNT_FEE_VALUE = "discount-fee-value" -TOTAL_FEE_VALUE = "total-fee-value" -RUNNING_NOTIONAL_TAKER_VOLUME = "running-notional-taker-volume" -EPOCHS_IN_REFERRAL_SET = "epochs-in-referral-set" -REQUIRED_EPOCHS_VALUE_0 = "required-epochs-value-0" -REQUIRED_EPOCHS_VALUE_1 = "required-epochs-value-1" -FILLS = "Fills" -TAB_FILLS = "tab-fills" -FEE_BREAKDOWN_TOOLTIP = "fee-breakdown-tooltip" -PINNED_ROW_LOCATOR = ".ag-pinned-left-cols-container .ag-row" -ROW_LOCATOR = ".ag-center-cols-container .ag-row" -# Col-Ids: -COL_INSTRUMENT_CODE = '[data-testid="market-code"]' -COL_CODE = '[col-id="code"]' -COL_SIZE = '[col-id="size"]' -COL_PRICE = '[col-id="price"]' -COL_PRICE_1 = '[col-id="price_1"]' -COL_AGGRESSOR = '[col-id="aggressor"]' -COL_FEE = '[col-id="fee"]' -COL_FEE_DISCOUNT = '[col-id="fee-discount"]' -COL_FEE_AFTER_DISCOUNT = '[col-id="feeAfterDiscount"]' -COL_INFRA_FEE = '[col-id="infraFee"]' -COL_MAKER_FEE = '[col-id="makerFee"]' -COL_LIQUIDITY_FEE = '[col-id="liquidityFee"]' -COL_TOTAL_FEE = '[col-id="totalFee"]' -# endregion - -@pytest.fixture(scope="module") -def market_ids(): - return { - "tier_1_volume": "default_id", - "tier_2_volume": "default_id", - "tier_1_referral": "default_id", - "tier_2_referral": "default_id", - "combo": "default_id", - } - - -@pytest.fixture(scope="module") -def vega_volume_discount_tier_1(request): - with init_vega(request) as vega_volume_discount_tier_1: - request.addfinalizer(lambda: cleanup_container(vega_volume_discount_tier_1)) # Register the cleanup function - yield vega_volume_discount_tier_1 - - -@pytest.fixture(scope="module") -def vega_volume_discount_tier_2(request): - with init_vega(request) as vega_volume_discount_tier_2: - request.addfinalizer(lambda: cleanup_container(vega_volume_discount_tier_2)) # Register the cleanup function - yield vega_volume_discount_tier_2 - - -@pytest.fixture(scope="module") -def vega_referral_discount_tier_1(request): - with init_vega(request) as vega_referral_discount_tier_1: - request.addfinalizer(lambda: cleanup_container(vega_referral_discount_tier_1)) # Register the cleanup function - yield vega_referral_discount_tier_1 - - -@pytest.fixture(scope="module") -def vega_referral_discount_tier_2(request): - with init_vega(request) as vega_referral_discount_tier_2: - request.addfinalizer(lambda: cleanup_container(vega_referral_discount_tier_2)) # Register the cleanup function - yield vega_referral_discount_tier_2 - - -@pytest.fixture(scope="module") -def vega_referral_and_volume_discount(request): - with init_vega(request) as vega_referral_and_volume_discount: - request.addfinalizer(lambda: cleanup_container(vega_referral_and_volume_discount)) # Register the cleanup function - yield vega_referral_and_volume_discount - - -@pytest.fixture -def page(vega_instance, browser, request): - with init_page(vega_instance, browser, request) as page_instance: - yield page_instance - - -@pytest.fixture -def vega_instance( - tier, - discount_program, - vega_volume_discount_tier_1, - vega_volume_discount_tier_2, - vega_referral_discount_tier_1, - vega_referral_discount_tier_2, - vega_referral_and_volume_discount, -): - if discount_program == "volume": - return vega_volume_discount_tier_1 if tier == 1 else vega_volume_discount_tier_2 - elif discount_program == "referral": - return ( - vega_referral_discount_tier_1 - if tier == 1 - else vega_referral_discount_tier_2 - ) - elif discount_program == "combo": - return vega_referral_and_volume_discount - - -@pytest.fixture -def auth(vega_instance, page): - return auth_setup(vega_instance, page) - - -def setup_market_with_volume_discount_program(vega: VegaServiceNull, tier: int): - market = setup_continuous_market(vega, custom_quantum=100000) - vega.update_volume_discount_program( - proposal_key=MM_WALLET.name, - benefit_tiers=[ - { - "minimum_running_notional_taker_volume": 100, - "volume_discount_factor": 0.1, - }, - { - "minimum_running_notional_taker_volume": 200, - "volume_discount_factor": 0.2, - }, - ], - window_length=7, - ) - next_epoch(vega=vega) - - order_count = 2 if tier == 1 else 3 - for _ in range(order_count): - submit_order(vega, "Key 1", market, "SIDE_BUY", 1, 110) - forward_time(vega, True if _ < order_count - 1 else False) - - return market - - -def setup_market_with_referral_discount_program(vega: VegaServiceNull, tier: int): - market = setup_continuous_market(vega, custom_quantum=100000) - vega.update_referral_program( - proposal_key=MM_WALLET.name, - benefit_tiers=[ - { - "minimum_running_notional_taker_volume": 100, - "minimum_epochs": 1, - "referral_reward_factor": 0.1, - "referral_discount_factor": 0.1, - }, - { - "minimum_running_notional_taker_volume": 200, - "minimum_epochs": 2, - "referral_reward_factor": 0.2, - "referral_discount_factor": 0.2, - }, - ], - staking_tiers=[ - {"minimum_staked_tokens": 100, "referral_reward_multiplier": 1.1}, - {"minimum_staked_tokens": 200, "referral_reward_multiplier": 1.2}, - ], - window_length=1, - ) - vega.create_referral_set(key_name=MM_WALLET.name) - next_epoch(vega=vega) - referral_set_id = list(vega.list_referral_sets().keys())[0] - vega.apply_referral_code(key_name="Key 1", id=referral_set_id) - next_epoch(vega=vega) - - order_count = 2 - order_size = 1 if tier == 1 else 2 - for _ in range(order_count): - submit_order(vega, "Key 1", market, "SIDE_BUY", order_size, 110) - forward_time(vega, True if _ < order_count - 1 else False) - - return market - - -def setup_combined_market(vega: VegaServiceNull): - market = setup_continuous_market(vega, custom_quantum=100000) - vega.update_volume_discount_program( - proposal_key=MM_WALLET.name, - benefit_tiers=[ - { - "minimum_running_notional_taker_volume": 100, - "volume_discount_factor": 0.1, - }, - { - "minimum_running_notional_taker_volume": 200, - "volume_discount_factor": 0.2, - }, - ], - window_length=7, - ) - next_epoch(vega=vega) - - vega.update_referral_program( - proposal_key=MM_WALLET.name, - benefit_tiers=[ - { - "minimum_running_notional_taker_volume": 100, - "minimum_epochs": 1, - "referral_reward_factor": 0.1, - "referral_discount_factor": 0.1, - }, - { - "minimum_running_notional_taker_volume": 200, - "minimum_epochs": 2, - "referral_reward_factor": 0.2, - "referral_discount_factor": 0.2, - }, - ], - staking_tiers=[ - {"minimum_staked_tokens": 100, "referral_reward_multiplier": 1.1}, - {"minimum_staked_tokens": 200, "referral_reward_multiplier": 1.2}, - ], - window_length=1, - ) - vega.create_referral_set(key_name=MM_WALLET.name) - next_epoch(vega=vega) - referral_set_id = list(vega.list_referral_sets().keys())[0] - vega.apply_referral_code(key_name="Key 1", id=referral_set_id) - next_epoch(vega=vega) - - order_count = 2 - order_size = 2 - for _ in range(order_count): - submit_order(vega, "Key 1", market, "SIDE_BUY", order_size, 110) - forward_time(vega, True if _ < order_count - 1 else False) - return market - - -def set_market_volume_discount(vega, tier, discount_program, market_ids): - market_id_key = f"tier_{tier}_{discount_program}" - if discount_program == "combo": - market_id_key = "combo" - - market_id = market_ids.get(market_id_key, "default_id") - - print(f"Checking if market exists: {market_id}") - if not market_exists(vega, market_id): - print( - f"Market doesn't exist for {discount_program} tier {tier}. Setting up new market." - ) - - if discount_program == "volume": - market_id = setup_market_with_volume_discount_program(vega, tier) - elif discount_program == "referral": - market_id = setup_market_with_referral_discount_program(vega, tier) - elif discount_program == "combo": - market_id = setup_combined_market(vega) - - market_ids[market_id_key] = market_id - - print(f"Using market ID: {market_id}") - return market_ids - - -@pytest.mark.parametrize( - "tier, discount_program, expected_text", - [ - (1, "volume", "9.045%-9.045%"), - (2, "volume", "8.04%-8.04%"), - (1, "referral", "9.045%-9.045%"), - (2, "referral", "8.04%-8.04%"), - (2, "combo", "6.432%-6.432%"), - ], -) -@pytest.mark.usefixtures("risk_accepted", "auth", "market_ids") -def test_fees_page_discount_program_my_trading_fees( - tier, expected_text, discount_program, vega_instance, page: Page, market_ids -): - market_ids = set_market_volume_discount( - vega_instance, tier, discount_program, market_ids - ) - - page.goto("/#/fees") - expect(page.get_by_test_id(ADJUSTED_FEES)).to_have_text(expected_text) - expect(page.get_by_test_id(TOTAL_FEE_BEFORE_DISCOUNT)).to_have_text( - "Total fee before discount10.05%-10.05%" - ) - expect(page.get_by_test_id(INFRASTRUCTURE_FEES)).to_have_text("Infrastructure0.05%") - expect(page.get_by_test_id(MAKER_FEES)).to_have_text("Maker10%") - expect(page.get_by_test_id(LIQUIDITY_FEES)).to_have_text("Liquidity0%-0%") - - -@pytest.mark.parametrize( - "tier, discount_program, volume_discount, total_discount, referral_discount", - [ - (1, "volume", "Volume discount10%", "10%", "Referral discount0%"), - (2, "volume", "Volume discount20%", "20%", "Referral discount0%"), - (1, "referral", "Volume discount0%", "10%", "Referral discount10%"), - (2, "referral", "Volume discount0%", "20%", "Referral discount20%"), - (2, "combo", "Volume discount20%", "36%", "Referral discount20%"), - ], -) -@pytest.mark.usefixtures("risk_accepted", "auth", "market_ids") -def test_fees_page_discount_program_total_discount( - tier, - discount_program, - volume_discount, - referral_discount, - total_discount, - vega_instance, - page: Page, - market_ids, -): - market_ids = set_market_volume_discount( - vega_instance, tier, discount_program, market_ids - ) - page.goto("/#/fees") - expect(page.get_by_test_id(TOTAL_DISCOUNT)).to_have_text(total_discount) - expect(page.get_by_test_id(VOLUME_DISCOUNT_ROW)).to_have_text(volume_discount) - expect(page.get_by_test_id(REFERRAL_DISCOUNT_ROW)).to_have_text(referral_discount) - page.get_by_test_id(TOTAL_DISCOUNT).hover() - expect(page.get_by_test_id(TOOLTIP_CONTENT).nth(0)).to_have_text( - "The total discount is calculated according to the following formula: 1 - (1 - dvolume) ⋇ (1 - dreferral)" - ) - - -@pytest.mark.parametrize( - "tier, discount_program, past_epochs_volume, required_for_next_tier", - [(1, "volume", "103", "97"), (2, "volume", "206", "")], -) -@pytest.mark.usefixtures("risk_accepted", "auth", "market_ids") -def test_fees_page_volume_discount_program_my_current_volume( - tier, - discount_program, - past_epochs_volume, - required_for_next_tier, - vega_instance, - page: Page, - market_ids, -): - market_ids = set_market_volume_discount( - vega_instance, tier, discount_program, market_ids - ) - page.goto("/#/fees") - expect(page.get_by_test_id(PAST_EPOCHS_VOLUME)).to_have_text(past_epochs_volume) - - if tier == 1: - expect(page.get_by_test_id(REQUIRED_FOR_NEXT_TIER)).to_have_text( - required_for_next_tier - ) - else: - expect(page.get_by_test_id(REQUIRED_FOR_NEXT_TIER)).not_to_be_visible() - - -@pytest.mark.parametrize( - "tier, discount_program, notional_taker_volume, epochs_in_set", - [(1, "referral", "103", "1"), (2, "referral", "207", "1")], -) -@pytest.mark.usefixtures("risk_accepted", "auth", "market_ids") -def test_fees_page_referral_discount_program_referral_benefits( - tier, - vega_instance, - discount_program, - notional_taker_volume, - epochs_in_set, - page: Page, - market_ids, -): - market_ids = set_market_volume_discount( - vega_instance, tier, discount_program, market_ids - ) - page.goto("/#/fees") - expect(page.get_by_test_id(RUNNING_NOTIONAL_TAKER_VOLUME)).to_have_text( - notional_taker_volume - ) - expect(page.get_by_test_id(EPOCHS_IN_REFERRAL_SET)).to_have_text(epochs_in_set) - - -@pytest.mark.parametrize( - "tier, discount_program, my_volume_test_id, my_volume_value, your_tier", - [ - (1, "volume", "my-volume-value-0", "103", "your-volume-tier-0"), - (2, "volume", "my-volume-value-1", "206", "your-volume-tier-1"), - (1, "referral", "my-volume-value-0", "103", "your-referral-tier-0"), - (2, "referral", "my-volume-value-1", "206", "your-referral-tier-1"), - ], -) -@pytest.mark.usefixtures("risk_accepted", "auth", "market_ids") -def test_fees_page_discount_program_discount( - tier, - discount_program, - my_volume_test_id, - my_volume_value, - your_tier, - vega_instance, - page: Page, - market_ids, -): - market_ids = set_market_volume_discount( - vega_instance, tier, discount_program, market_ids - ) - page.goto("/#/fees") - expect(page.get_by_test_id(TIER_VALUE_0)).to_have_text("1") - expect(page.get_by_test_id(TIER_VALUE_1)).to_have_text("2") - expect(page.get_by_test_id(DISCOUNT_VALUE_0)).to_have_text("10%") - expect(page.get_by_test_id(DISCOUNT_VALUE_1)).to_have_text("20%") - expect(page.get_by_test_id(MIN_VOLUME_VALUE_0)).to_have_text("100") - expect(page.get_by_test_id(MIN_VOLUME_VALUE_1)).to_have_text("200") - - if discount_program == "volume": - expect(page.get_by_test_id(my_volume_test_id)).to_have_text(my_volume_value) - else: - expect(page.get_by_test_id(REQUIRED_EPOCHS_VALUE_0)).to_have_text("1") - expect(page.get_by_test_id(REQUIRED_EPOCHS_VALUE_1)).to_have_text("2") - - expect(page.get_by_test_id(your_tier).nth(1)).to_be_visible() - expect(page.get_by_test_id(your_tier).nth(1)).to_have_text("Your tier") - - -@pytest.mark.parametrize( - "tier, discount_program, fees_after_discount", - [ - (1, "volume", "9.045%"), - (2, "volume", "8.04%"), - (1, "referral", "9.045%"), - (2, "referral", "8.04%"), - (2, "combo", "6.432%"), - ], -) -@pytest.mark.usefixtures("risk_accepted", "auth", "market_ids") -def test_fees_page_discount_program_fees_by_market( - tier, discount_program, fees_after_discount, vega_instance, page: Page, market_ids -): - market_ids = set_market_volume_discount( - vega_instance, tier, discount_program, market_ids - ) - page.goto("/#/fees") - pinned = page.locator(PINNED_ROW_LOCATOR) - row = page.locator(ROW_LOCATOR) - expect(pinned.locator(COL_CODE)).to_have_text("BTC:DAI_2023Futr") - expect(row.locator(COL_FEE_AFTER_DISCOUNT)).to_have_text(fees_after_discount) - expect(row.locator(COL_INFRA_FEE)).to_have_text("0.05%") - expect(row.locator(COL_MAKER_FEE)).to_have_text("10%") - expect(row.locator(COL_LIQUIDITY_FEE)).to_have_text("0%") - expect(row.locator(COL_TOTAL_FEE)).to_have_text("10.05%") - - -@pytest.mark.parametrize( - "tier, discount_program, discount, discount_value, total_fee", - [ - (1, "volume", "-10%", "-0.01005 tDAI", "0.09045 tDAI"), - (2, "volume", "-20%", "-0.0201 tDAI", "0.0804 tDAI"), - (1, "referral", "-10%", "-0.01005 tDAI", "0.09045 tDAI"), - (2, "referral", "-20%", "-0.0201 tDAI", "0.0804 tDAI"), - (2, "combo", "-36%", "-0.03618 tDAI", "0.06432 tDAI"), - ], -) -@pytest.mark.usefixtures("risk_accepted", "auth", "market_ids") -def test_deal_ticket_discount_program( - tier, - discount_program, - discount, - discount_value, - total_fee, - vega_instance, - page: Page, - market_ids, -): - market_ids = set_market_volume_discount( - vega_instance, tier, discount_program, market_ids - ) - market_id_key = f"tier_{tier}_{discount_program}" - if discount_program == "combo": - market_id_key = "combo" - market_id = market_ids.get(market_id_key) - page.goto(f"/#/markets/{market_id}") - page.get_by_test_id(ORDER_SIZE).fill("1") - page.get_by_test_id(ORDER_PRICE).fill("1") - expect(page.get_by_test_id(DISCOUNT_PILL)).to_have_text(discount) - page.get_by_test_id(FEES_TEXT).hover() - tooltip = page.get_by_test_id(TOOLTIP_CONTENT).first - expect(tooltip.get_by_test_id(INFRASTRUCTURE_FEE_FACTOR)).to_have_text("0.05%") - expect(tooltip.get_by_test_id(INFRASTRUCTURE_FEE_VALUE)).to_have_text("0.0005 tDAI") - expect(tooltip.get_by_test_id(LIQUIDITY_FEE_FACTOR)).to_have_text("0%") - expect(tooltip.get_by_test_id(LIQUIDITY_FEE_VALUE)).to_have_text("0.00 tDAI") - expect(tooltip.get_by_test_id(MAKER_FEE_FACTOR)).to_have_text("10%") - expect(tooltip.get_by_test_id(MAKER_FEE_VALUE)).to_have_text("0.10 tDAI") - expect(tooltip.get_by_test_id(SUBTOTAL_FEE_FACTOR)).to_have_text("10.05%") - expect(tooltip.get_by_test_id(SUBTOTAL_FEE_VALUE)).to_have_text("0.1005 tDAI") - expect(tooltip.get_by_test_id(DISCOUNT_FEE_FACTOR)).to_have_text(discount) - expect(tooltip.get_by_test_id(DISCOUNT_FEE_VALUE)).to_have_text(discount_value) - expect(tooltip.get_by_test_id(TOTAL_FEE_VALUE)).to_have_text(total_fee) - - -@pytest.mark.parametrize( - "tier, discount_program, fee, fee_discount, price_1, size", - [ - (1, "volume", "9.36158 tDAI", "1.04017 tDAI", "103.50 tDAI", "+1"), - (2, "volume", "8.3214 tDAI", "2.08035 tDAI", "103.50 tDAI", "+1"), - ( - 1, - "referral", - "8.42543 tDAI ", - "1.04017 tDAI", - "103.50 tDAI", - "+1", - ), - ( - 2, - "referral", - "13.31424 tDAI", - "4.1607 tDAI", - "207.00 tDAI", - "+2", - ), - (2, "combo", "10.6514 tDAI ", "7.48926 tDAI", "207.00 tDAI", "+2"), - ], -) -@pytest.mark.usefixtures("risk_accepted", "auth", "market_ids") -def test_fills_taker_discount_program( - tier, - discount_program, - fee, - fee_discount, - price_1, - size, - vega_instance, - page: Page, - market_ids, -): - market_ids = set_market_volume_discount( - vega_instance, tier, discount_program, market_ids - ) - market_id_key = f"tier_{tier}_{discount_program}" - if discount_program == "combo": - market_id_key = "combo" - market_id = market_ids.get(market_id_key) - page.goto(f"/#/markets/{market_id}") - page.get_by_test_id(FILLS).click() - row = page.get_by_test_id(TAB_FILLS).locator(ROW_LOCATOR).first - expect(row.locator(COL_SIZE)).to_have_text(size) - expect(row.locator(COL_PRICE)).to_have_text("103.50 tDAI") - expect(row.locator(COL_PRICE_1)).to_have_text(price_1) - expect(row.locator(COL_AGGRESSOR)).to_have_text("Taker") - expect(row.locator(COL_FEE)).to_have_text(fee) - expect(row.locator(COL_FEE_DISCOUNT)).to_have_text(fee_discount) - - -@pytest.mark.parametrize( - "tier, discount_program, fee, fee_discount, size, price_1", - [ - (1, "volume", "-9.315 tDAI", "1.035 tDAI", "-1", "103.50 tDAI"), - (2, "volume", "-8.28 tDAI", "2.07 tDAI", "-1", "103.50 tDAI"), - (1, "referral", "-8.3835 tDAI", "1.035 tDAI", "-1", "103.50 tDAI"), - (2, "referral", "-13.248 tDAI", "4.14 tDAI", "-2", "207.00 tDAI"), - (2, "combo", "-10.5984 tDAI ", "7.452 tDAI", "-2", "207.00 tDAI"), - ], -) -@pytest.mark.usefixtures("risk_accepted", "auth", "market_ids") -def test_fills_maker_discount_program( - tier, - discount_program, - vega_instance, - fee, - fee_discount, - size, - price_1, - page: Page, - market_ids, -): - market_ids = set_market_volume_discount( - vega_instance, tier, discount_program, market_ids - ) - market_id_key = f"tier_{tier}_{discount_program}" - if discount_program == "combo": - market_id_key = "combo" - market_id = market_ids.get(market_id_key) - page.goto(f"/#/markets/{market_id}") - change_keys(page, vega_instance, MM_WALLET.name) - page.get_by_test_id(FILLS).click() - row = page.get_by_test_id(TAB_FILLS).locator(ROW_LOCATOR).first - expect(row.locator(COL_SIZE)).to_have_text(size) - expect(row.locator(COL_PRICE)).to_have_text("103.50 tDAI") - expect(row.locator(COL_PRICE_1)).to_have_text(price_1) - expect(row.locator(COL_AGGRESSOR)).to_have_text("Maker") - expect(row.locator(COL_FEE)).to_have_text(fee) - expect(row.locator(COL_FEE_DISCOUNT)).to_have_text(fee_discount) - - -@pytest.mark.parametrize( - "tier, discount_program, fee", - [ - (1, "volume", "9.315"), - (2, "volume", "8.28"), - (1, "referral", "8.3835"), - (2, "referral", "13.248"), - (2, "combo", "10.5984"), - ], -) -@pytest.mark.usefixtures("risk_accepted", "auth", "market_ids") -def test_fills_maker_fee_tooltip_discount_program( - tier, discount_program, fee, vega_instance, page: Page, market_ids -): - market_ids = set_market_volume_discount( - vega_instance, tier, discount_program, market_ids - ) - market_id_key = f"tier_{tier}_{discount_program}" - if discount_program == "combo": - market_id_key = "combo" - market_id = market_ids.get(market_id_key) - page.goto(f"/#/markets/{market_id}") - change_keys(page, vega_instance, MM_WALLET.name) - page.get_by_test_id(FILLS).click() - row = page.get_by_test_id(TAB_FILLS).locator(ROW_LOCATOR).first - # tbd - tooltip is not visible without this wait - page.wait_for_timeout(1000) - row.locator(COL_FEE).hover() - expect(page.get_by_test_id(FEE_BREAKDOWN_TOOLTIP)).to_have_text( - f"If the market was activeFee revenue to be received by the maker, takers' fee discounts already applied.During continuous trading the maker pays no infrastructure and liquidity fees.Infrastructure fee0.00 tDAILiquidity fee0.00 tDAIMaker fee-{fee} tDAITotal fees-{fee} tDAI" - ) - - -@pytest.mark.parametrize( - "tier, discount_program, maker_fee, total_fee, infra_fee", - [ - (1, "volume", "9.315", "9.36158", "0.04658"), - (2, "volume", "8.28", "8.3214", "0.0414"), - (1, "referral", "8.3835", "8.42543", "0.04193"), - (2, "referral", "13.248", "13.31424", "0.06624"), - (2, "combo", "10.5984", "10.6514", "0.053"), - ], -) -@pytest.mark.usefixtures("risk_accepted", "auth", "market_ids") -def test_fills_taker_fee_tooltip_discount_program( - tier, - discount_program, - vega_instance, - maker_fee, - total_fee, - infra_fee, - page: Page, - market_ids, -): - market_ids = set_market_volume_discount( - vega_instance, tier, discount_program, market_ids - ) - market_id_key = f"tier_{tier}_{discount_program}" - if discount_program == "combo": - market_id_key = "combo" - market_id = market_ids.get(market_id_key) - page.goto(f"/#/markets/{market_id}") - page.get_by_test_id(FILLS).click() - row = page.get_by_test_id(TAB_FILLS).locator(ROW_LOCATOR).first - # tbd - tooltip is not visible without this wait - page.wait_for_timeout(1000) - row.locator(COL_FEE).hover() - expect(page.get_by_test_id(FEE_BREAKDOWN_TOOLTIP)).to_have_text( - f"If the market was activeFees to be paid by the taker; discounts are already applied.Infrastructure fee{infra_fee} tDAILiquidity fee0.00 tDAIMaker fee{maker_fee} tDAITotal fees{total_fee} tDAI" - ) \ No newline at end of file diff --git a/apps/trading/e2e/tests/fees/test_fees_combo_tier_2.py b/apps/trading/e2e/tests/fees/test_fees_combo_tier_2.py new file mode 100644 index 000000000..dd7f3e1a2 --- /dev/null +++ b/apps/trading/e2e/tests/fees/test_fees_combo_tier_2.py @@ -0,0 +1,216 @@ +import pytest +from fees_test_ids import * +from playwright.sync_api import Page, expect +from vega_sim.null_service import VegaServiceNull +from actions.vega import submit_order +from wallet_config import MM_WALLET +from conftest import ( + init_vega, + init_page, + auth_setup, + risk_accepted_setup, + cleanup_container, +) +from actions.utils import next_epoch, change_keys, forward_time +from fixtures.market import setup_continuous_market + + +@pytest.fixture(scope="module") +def vega(request): + with init_vega(request) as vega_instance: + request.addfinalizer( + lambda: cleanup_container(vega_instance) + ) + yield vega_instance + + +@pytest.fixture(scope="module") +def page(vega, browser, request): + with init_page(vega, browser, request) as page: + risk_accepted_setup(page) + auth_setup(vega, page) + yield page + + +@pytest.fixture(scope="module", autouse=True) +def setup_combined_market(vega: VegaServiceNull): + market = setup_continuous_market(vega, custom_quantum=100000) + vega.update_volume_discount_program( + proposal_key=MM_WALLET.name, + benefit_tiers=[ + { + "minimum_running_notional_taker_volume": 100, + "volume_discount_factor": 0.1, + }, + { + "minimum_running_notional_taker_volume": 200, + "volume_discount_factor": 0.2, + }, + ], + window_length=7, + ) + next_epoch(vega=vega) + + vega.update_referral_program( + proposal_key=MM_WALLET.name, + benefit_tiers=[ + { + "minimum_running_notional_taker_volume": 100, + "minimum_epochs": 1, + "referral_reward_factor": 0.1, + "referral_discount_factor": 0.1, + }, + { + "minimum_running_notional_taker_volume": 200, + "minimum_epochs": 2, + "referral_reward_factor": 0.2, + "referral_discount_factor": 0.2, + }, + ], + staking_tiers=[ + {"minimum_staked_tokens": 100, "referral_reward_multiplier": 1.1}, + {"minimum_staked_tokens": 200, "referral_reward_multiplier": 1.2}, + ], + window_length=1, + ) + vega.create_referral_set(key_name=MM_WALLET.name) + next_epoch(vega=vega) + referral_set_id = list(vega.list_referral_sets().keys())[0] + vega.apply_referral_code(key_name="Key 1", id=referral_set_id) + next_epoch(vega=vega) + + for _ in range(2): + submit_order(vega, "Key 1", market, "SIDE_BUY", 2, 110) + forward_time(vega, True if _ < 2 - 1 else False) + return market + + +@pytest.mark.xdist_group(name="test_fees_combo_tier_2") +def test_fees_page_discount_program_my_trading_fees(page: Page): + page.goto("/#/fees") + expect(page.get_by_test_id(ADJUSTED_FEES)).to_have_text("6.432%-6.432%") + expect(page.get_by_test_id(TOTAL_FEE_BEFORE_DISCOUNT)).to_have_text( + "Total fee before discount10.05%-10.05%" + ) + expect(page.get_by_test_id(INFRASTRUCTURE_FEES)).to_have_text("Infrastructure0.05%") + expect(page.get_by_test_id(MAKER_FEES)).to_have_text("Maker10%") + expect(page.get_by_test_id(LIQUIDITY_FEES)).to_have_text("Liquidity0%-0%") + + +@pytest.mark.xdist_group(name="test_fees_combo_tier_2") +def test_fees_page_discount_program_total_discount( + page: Page, +): + page.goto("/#/fees") + expect(page.get_by_test_id(TOTAL_DISCOUNT)).to_have_text("36%") + expect(page.get_by_test_id(VOLUME_DISCOUNT_ROW)).to_have_text("Volume discount20%") + expect(page.get_by_test_id(REFERRAL_DISCOUNT_ROW)).to_have_text( + "Referral discount20%" + ) + page.get_by_test_id(TOTAL_DISCOUNT).hover() + expect(page.get_by_test_id(TOOLTIP_CONTENT).nth(0)).to_have_text( + "The total discount is calculated according to the following formula: 1 - (1 - dvolume) ⋇ (1 - dreferral)" + ) + + +@pytest.mark.xdist_group(name="test_fees_combo_tier_2") +def test_fees_page_discount_program_fees_by_market(page: Page): + page.goto("/#/fees") + pinned = page.locator(PINNED_ROW_LOCATOR) + row = page.locator(ROW_LOCATOR) + expect(pinned.locator(COL_CODE)).to_have_text("BTC:DAI_2023Futr") + expect(row.locator(COL_FEE_AFTER_DISCOUNT)).to_have_text("6.432%") + expect(row.locator(COL_INFRA_FEE)).to_have_text("0.05%") + expect(row.locator(COL_MAKER_FEE)).to_have_text("10%") + expect(row.locator(COL_LIQUIDITY_FEE)).to_have_text("0%") + expect(row.locator(COL_TOTAL_FEE)).to_have_text("10.05%") + + +@pytest.mark.xdist_group(name="test_fees_combo_tier_2") +def test_deal_ticket_discount_program( + page: Page, + setup_combined_market, +): + page.goto(f"/#/markets/{setup_combined_market}") + page.get_by_test_id(ORDER_SIZE).fill("1") + page.get_by_test_id(ORDER_PRICE).fill("1") + expect(page.get_by_test_id(DISCOUNT_PILL)).to_have_text("-36%") + page.get_by_test_id(FEES_TEXT).hover() + tooltip = page.get_by_test_id(TOOLTIP_CONTENT).first + expect(tooltip.get_by_test_id(INFRASTRUCTURE_FEE_FACTOR)).to_have_text("0.05%") + expect(tooltip.get_by_test_id(INFRASTRUCTURE_FEE_VALUE)).to_have_text("0.0005 tDAI") + expect(tooltip.get_by_test_id(LIQUIDITY_FEE_FACTOR)).to_have_text("0%") + expect(tooltip.get_by_test_id(LIQUIDITY_FEE_VALUE)).to_have_text("0.00 tDAI") + expect(tooltip.get_by_test_id(MAKER_FEE_FACTOR)).to_have_text("10%") + expect(tooltip.get_by_test_id(MAKER_FEE_VALUE)).to_have_text("0.10 tDAI") + expect(tooltip.get_by_test_id(SUBTOTAL_FEE_FACTOR)).to_have_text("10.05%") + expect(tooltip.get_by_test_id(SUBTOTAL_FEE_VALUE)).to_have_text("0.1005 tDAI") + expect(tooltip.get_by_test_id(DISCOUNT_FEE_FACTOR)).to_have_text("-36%") + expect(tooltip.get_by_test_id(DISCOUNT_FEE_VALUE)).to_have_text("-0.03618 tDAI") + expect(tooltip.get_by_test_id(TOTAL_FEE_VALUE)).to_have_text("0.06432 tDAI") + + +@pytest.mark.xdist_group(name="test_fees_combo_tier_2") +def test_fills_taker_discount_program( + page: Page, + setup_combined_market, +): + page.goto(f"/#/markets/{setup_combined_market}") + page.get_by_test_id(FILLS).click() + row = page.get_by_test_id(TAB_FILLS).locator(ROW_LOCATOR).first + expect(row.locator(COL_SIZE)).to_have_text("+2") + expect(row.locator(COL_PRICE)).to_have_text("103.50 tDAI") + expect(row.locator(COL_PRICE_1)).to_have_text("207.00 tDAI") + expect(row.locator(COL_AGGRESSOR)).to_have_text("Taker") + expect(row.locator(COL_FEE)).to_have_text("10.6514 tDAI") + expect(row.locator(COL_FEE_DISCOUNT)).to_have_text("7.48926 tDAI") + + +@pytest.mark.xdist_group(name="test_fees_combo_tier_2") +def test_fills_maker_discount_program( + vega: VegaServiceNull, + page: Page, + setup_combined_market, +): + page.goto(f"/#/markets/{setup_combined_market}") + change_keys(page, vega, MM_WALLET.name) + page.get_by_test_id(FILLS).click() + row = page.get_by_test_id(TAB_FILLS).locator(ROW_LOCATOR).first + expect(row.locator(COL_SIZE)).to_have_text("-2") + expect(row.locator(COL_PRICE)).to_have_text("103.50 tDAI") + expect(row.locator(COL_PRICE_1)).to_have_text("207.00 tDAI") + expect(row.locator(COL_AGGRESSOR)).to_have_text("Maker") + expect(row.locator(COL_FEE)).to_have_text("-10.5984 tDAI") + expect(row.locator(COL_FEE_DISCOUNT)).to_have_text("7.452 tDAI") + + +@pytest.mark.xdist_group(name="test_fees_combo_tier_2") +def test_fills_maker_fee_tooltip_discount_program( + vega: VegaServiceNull, page: Page, setup_combined_market +): + page.goto(f"/#/markets/{setup_combined_market}") + change_keys(page, vega, MM_WALLET.name) + page.get_by_test_id(FILLS).click() + row = page.get_by_test_id(TAB_FILLS).locator(ROW_LOCATOR).first + # tbd - tooltip is not visible without this wait + page.wait_for_timeout(1000) + row.locator(COL_FEE).hover() + expect(page.get_by_test_id(FEE_BREAKDOWN_TOOLTIP)).to_have_text( + "If the market was activeFee revenue to be received by the maker, takers' fee discounts already applied.During continuous trading the maker pays no infrastructure and liquidity fees.Infrastructure fee0.00 tDAILiquidity fee0.00 tDAIMaker fee-10.5984 tDAITotal fees-10.5984 tDAI" + ) + + +@pytest.mark.xdist_group(name="test_fees_combo_tier_2") +def test_fills_taker_fee_tooltip_discount_program( + page: Page, + setup_combined_market, +): + page.goto(f"/#/markets/{setup_combined_market}") + page.get_by_test_id(FILLS).click() + row = page.get_by_test_id(TAB_FILLS).locator(ROW_LOCATOR).first + # tbd - tooltip is not visible without this wait + page.wait_for_timeout(1000) + row.locator(COL_FEE).hover() + expect(page.get_by_test_id(FEE_BREAKDOWN_TOOLTIP)).to_have_text( + "If the market was activeFee revenue to be received by the maker, takers' fee discounts already applied.During continuous trading the maker pays no infrastructure and liquidity fees.Infrastructure fee0.00 tDAILiquidity fee0.00 tDAIMaker fee-10.5984 tDAITotal fees-10.5984 tDAI" + ) diff --git a/apps/trading/e2e/tests/fees/test_fees_referral_discount_tier_1.py b/apps/trading/e2e/tests/fees/test_fees_referral_discount_tier_1.py new file mode 100644 index 000000000..877672ba6 --- /dev/null +++ b/apps/trading/e2e/tests/fees/test_fees_referral_discount_tier_1.py @@ -0,0 +1,221 @@ +import pytest +from fees_test_ids import * +from playwright.sync_api import Page, expect +from vega_sim.null_service import VegaServiceNull +from actions.vega import submit_order +from wallet_config import MM_WALLET +from conftest import ( + init_vega, + init_page, + auth_setup, + risk_accepted_setup, + cleanup_container, +) +from actions.utils import next_epoch, change_keys, forward_time +from fixtures.market import setup_continuous_market + +@pytest.fixture(scope="module") +def vega(request): + with init_vega(request) as vega_instance: + request.addfinalizer( + lambda: cleanup_container(vega_instance) + ) + yield vega_instance + + +@pytest.fixture(scope="module") +def page(vega, browser, request): + with init_page(vega, browser, request) as page: + risk_accepted_setup(page) + auth_setup(vega, page) + yield page + + +@pytest.fixture(scope="module", autouse=True) +def setup_market_with_referral_discount_program(vega: VegaServiceNull): + market = setup_continuous_market(vega, custom_quantum=100000) + vega.update_referral_program( + proposal_key=MM_WALLET.name, + benefit_tiers=[ + { + "minimum_running_notional_taker_volume": 100, + "minimum_epochs": 1, + "referral_reward_factor": 0.1, + "referral_discount_factor": 0.1, + }, + { + "minimum_running_notional_taker_volume": 200, + "minimum_epochs": 2, + "referral_reward_factor": 0.2, + "referral_discount_factor": 0.2, + }, + ], + staking_tiers=[ + {"minimum_staked_tokens": 100, "referral_reward_multiplier": 1.1}, + {"minimum_staked_tokens": 200, "referral_reward_multiplier": 1.2}, + ], + window_length=1, + ) + vega.create_referral_set(key_name=MM_WALLET.name) + next_epoch(vega=vega) + referral_set_id = list(vega.list_referral_sets().keys())[0] + vega.apply_referral_code(key_name="Key 1", id=referral_set_id) + next_epoch(vega=vega) + + for _ in range(2): + submit_order(vega, "Key 1", market, "SIDE_BUY", 1, 110) + forward_time(vega, True if _ < 2 - 1 else False) + + return market + + +@pytest.mark.xdist_group(name="test_fees_referral_tier_1") +def test_fees_page_discount_program_my_trading_fees(page: Page): + page.goto("/#/fees") + expect(page.get_by_test_id(ADJUSTED_FEES)).to_have_text("9.045%-9.045%") + expect(page.get_by_test_id(TOTAL_FEE_BEFORE_DISCOUNT)).to_have_text( + "Total fee before discount10.05%-10.05%" + ) + expect(page.get_by_test_id(INFRASTRUCTURE_FEES)).to_have_text("Infrastructure0.05%") + expect(page.get_by_test_id(MAKER_FEES)).to_have_text("Maker10%") + expect(page.get_by_test_id(LIQUIDITY_FEES)).to_have_text("Liquidity0%-0%") + + +@pytest.mark.xdist_group(name="test_fees_referral_tier_1") +def test_fees_page_discount_program_total_discount(page: Page): + page.goto("/#/fees") + expect(page.get_by_test_id(TOTAL_DISCOUNT)).to_have_text("10%") + expect(page.get_by_test_id(VOLUME_DISCOUNT_ROW)).to_have_text("Volume discount0%") + expect(page.get_by_test_id(REFERRAL_DISCOUNT_ROW)).to_have_text( + "Referral discount10%" + ) + page.get_by_test_id(TOTAL_DISCOUNT).hover() + expect(page.get_by_test_id(TOOLTIP_CONTENT).nth(0)).to_have_text( + "The total discount is calculated according to the following formula: 1 - (1 - dvolume) ⋇ (1 - dreferral)" + ) + + +@pytest.mark.xdist_group(name="test_fees_referral_tier_1") +def test_fees_page_referral_discount_program_referral_benefits(page: Page): + page.goto("/#/fees") + expect(page.get_by_test_id(RUNNING_NOTIONAL_TAKER_VOLUME)).to_have_text("103") + expect(page.get_by_test_id(EPOCHS_IN_REFERRAL_SET)).to_have_text("1") + + +@pytest.mark.xdist_group(name="test_fees_referral_tier_1") +def test_fees_page_discount_program_discount(page: Page): + page.goto("/#/fees") + expect(page.get_by_test_id(TIER_VALUE_0)).to_have_text("1") + expect(page.get_by_test_id(TIER_VALUE_1)).to_have_text("2") + expect(page.get_by_test_id(DISCOUNT_VALUE_0)).to_have_text("10%") + expect(page.get_by_test_id(DISCOUNT_VALUE_1)).to_have_text("20%") + expect(page.get_by_test_id(MIN_VOLUME_VALUE_0)).to_have_text("100") + expect(page.get_by_test_id(MIN_VOLUME_VALUE_1)).to_have_text("200") + + expect(page.get_by_test_id(REQUIRED_EPOCHS_VALUE_0)).to_have_text("1") + expect(page.get_by_test_id(REQUIRED_EPOCHS_VALUE_1)).to_have_text("2") + + expect(page.get_by_test_id("your-referral-tier-0").nth(1)).to_be_visible() + expect(page.get_by_test_id("your-referral-tier-0").nth(1)).to_have_text("Your tier") + + +@pytest.mark.xdist_group(name="test_fees_referral_tier_1") +def test_fees_page_discount_program_fees_by_market(page: Page): + page.goto("/#/fees") + pinned = page.locator(PINNED_ROW_LOCATOR) + row = page.locator(ROW_LOCATOR) + expect(pinned.locator(COL_CODE)).to_have_text("BTC:DAI_2023Futr") + expect(row.locator(COL_FEE_AFTER_DISCOUNT)).to_have_text("9.045%") + expect(row.locator(COL_INFRA_FEE)).to_have_text("0.05%") + expect(row.locator(COL_MAKER_FEE)).to_have_text("10%") + expect(row.locator(COL_LIQUIDITY_FEE)).to_have_text("0%") + expect(row.locator(COL_TOTAL_FEE)).to_have_text("10.05%") + + +@pytest.mark.xdist_group(name="test_fees_referral_tier_1") +def test_deal_ticket_discount_program( + page: Page, setup_market_with_referral_discount_program +): + page.goto(f"/#/markets/{setup_market_with_referral_discount_program}") + page.get_by_test_id(ORDER_SIZE).fill("1") + page.get_by_test_id(ORDER_PRICE).fill("1") + expect(page.get_by_test_id(DISCOUNT_PILL)).to_have_text("-10%") + page.get_by_test_id(FEES_TEXT).hover() + tooltip = page.get_by_test_id(TOOLTIP_CONTENT).first + expect(tooltip.get_by_test_id(INFRASTRUCTURE_FEE_FACTOR)).to_have_text("0.05%") + expect(tooltip.get_by_test_id(INFRASTRUCTURE_FEE_VALUE)).to_have_text("0.0005 tDAI") + expect(tooltip.get_by_test_id(LIQUIDITY_FEE_FACTOR)).to_have_text("0%") + expect(tooltip.get_by_test_id(LIQUIDITY_FEE_VALUE)).to_have_text("0.00 tDAI") + expect(tooltip.get_by_test_id(MAKER_FEE_FACTOR)).to_have_text("10%") + expect(tooltip.get_by_test_id(MAKER_FEE_VALUE)).to_have_text("0.10 tDAI") + expect(tooltip.get_by_test_id(SUBTOTAL_FEE_FACTOR)).to_have_text("10.05%") + expect(tooltip.get_by_test_id(SUBTOTAL_FEE_VALUE)).to_have_text("0.1005 tDAI") + expect(tooltip.get_by_test_id(DISCOUNT_FEE_FACTOR)).to_have_text("-10%") + expect(tooltip.get_by_test_id(DISCOUNT_FEE_VALUE)).to_have_text("-0.01005 tDAI") + expect(tooltip.get_by_test_id(TOTAL_FEE_VALUE)).to_have_text("0.09045 tDAI") + + +@pytest.mark.xdist_group(name="test_fees_referral_tier_1") +def test_fills_taker_discount_program( + page: Page, + setup_market_with_referral_discount_program, +): + page.goto(f"/#/markets/{setup_market_with_referral_discount_program}") + page.get_by_test_id(FILLS).click() + row = page.get_by_test_id(TAB_FILLS).locator(ROW_LOCATOR).first + expect(row.locator(COL_SIZE)).to_have_text("+1") + expect(row.locator(COL_PRICE)).to_have_text("103.50 tDAI") + expect(row.locator(COL_PRICE_1)).to_have_text("103.50 tDAI") + expect(row.locator(COL_AGGRESSOR)).to_have_text("Taker") + expect(row.locator(COL_FEE)).to_have_text("8.42543 tDAI") + expect(row.locator(COL_FEE_DISCOUNT)).to_have_text("1.04017 tDAI") + + +@pytest.mark.xdist_group(name="test_fees_referral_tier_1") +def test_fills_maker_discount_program( + vega: VegaServiceNull, + page: Page, + setup_market_with_referral_discount_program, +): + page.goto(f"/#/markets/{setup_market_with_referral_discount_program}") + change_keys(page, vega, MM_WALLET.name) + page.get_by_test_id(FILLS).click() + row = page.get_by_test_id(TAB_FILLS).locator(ROW_LOCATOR).first + expect(row.locator(COL_SIZE)).to_have_text("-1") + expect(row.locator(COL_PRICE)).to_have_text("103.50 tDAI") + expect(row.locator(COL_PRICE_1)).to_have_text("103.50 tDAI") + expect(row.locator(COL_AGGRESSOR)).to_have_text("Maker") + expect(row.locator(COL_FEE)).to_have_text("-8.3835 tDAI") + expect(row.locator(COL_FEE_DISCOUNT)).to_have_text("1.035 tDAI") + + +@pytest.mark.xdist_group(name="test_fees_referral_tier_1") +def test_fills_maker_fee_tooltip_discount_program( + vega: VegaServiceNull, page: Page, setup_market_with_referral_discount_program +): + page.goto(f"/#/markets/{setup_market_with_referral_discount_program}") + change_keys(page, vega, MM_WALLET.name) + page.get_by_test_id(FILLS).click() + row = page.get_by_test_id(TAB_FILLS).locator(ROW_LOCATOR).first + # tbd - tooltip is not visible without this wait + page.wait_for_timeout(1000) + row.locator(COL_FEE).hover() + expect(page.get_by_test_id(FEE_BREAKDOWN_TOOLTIP)).to_have_text( + "If the market was activeFee revenue to be received by the maker, takers' fee discounts already applied.During continuous trading the maker pays no infrastructure and liquidity fees.Infrastructure fee0.00 tDAILiquidity fee0.00 tDAIMaker fee-8.3835 tDAITotal fees-8.3835 tDAI" + ) + + +@pytest.mark.xdist_group(name="test_fees_referral_tier_1") +def test_fills_taker_fee_tooltip_discount_program( + page: Page, + setup_market_with_referral_discount_program, +): + page.goto(f"/#/markets/{setup_market_with_referral_discount_program}") + page.get_by_test_id(FILLS).click() + row = page.get_by_test_id(TAB_FILLS).locator(ROW_LOCATOR).first + # tbd - tooltip is not visible without this wait + page.wait_for_timeout(1000) + row.locator(COL_FEE).hover() + expect(page.get_by_test_id(FEE_BREAKDOWN_TOOLTIP)).to_have_text( + "If the market was activeFee revenue to be received by the maker, takers' fee discounts already applied.During continuous trading the maker pays no infrastructure and liquidity fees.Infrastructure fee0.00 tDAILiquidity fee0.00 tDAIMaker fee-8.3835 tDAITotal fees-8.3835 tDAI" + ) diff --git a/apps/trading/e2e/tests/fees/test_fees_referral_discount_tier_2.py b/apps/trading/e2e/tests/fees/test_fees_referral_discount_tier_2.py new file mode 100644 index 000000000..b6c860549 --- /dev/null +++ b/apps/trading/e2e/tests/fees/test_fees_referral_discount_tier_2.py @@ -0,0 +1,222 @@ +import pytest +from fees_test_ids import * +from playwright.sync_api import Page, expect +from vega_sim.null_service import VegaServiceNull +from actions.vega import submit_order +from wallet_config import MM_WALLET +from conftest import ( + init_vega, + init_page, + auth_setup, + risk_accepted_setup, + cleanup_container, +) +from actions.utils import next_epoch, change_keys, forward_time +from fixtures.market import setup_continuous_market + + +@pytest.fixture(scope="module") +def vega(request): + with init_vega(request) as vega_instance: + request.addfinalizer( + lambda: cleanup_container(vega_instance) + ) + yield vega_instance + + +@pytest.fixture(scope="module") +def page(vega, browser, request): + with init_page(vega, browser, request) as page: + risk_accepted_setup(page) + auth_setup(vega, page) + yield page + + +@pytest.fixture(scope="module", autouse=True) +def setup_market_with_referral_discount_program(vega: VegaServiceNull): + market = setup_continuous_market(vega, custom_quantum=100000) + vega.update_referral_program( + proposal_key=MM_WALLET.name, + benefit_tiers=[ + { + "minimum_running_notional_taker_volume": 100, + "minimum_epochs": 1, + "referral_reward_factor": 0.1, + "referral_discount_factor": 0.1, + }, + { + "minimum_running_notional_taker_volume": 200, + "minimum_epochs": 2, + "referral_reward_factor": 0.2, + "referral_discount_factor": 0.2, + }, + ], + staking_tiers=[ + {"minimum_staked_tokens": 100, "referral_reward_multiplier": 1.1}, + {"minimum_staked_tokens": 200, "referral_reward_multiplier": 1.2}, + ], + window_length=1, + ) + vega.create_referral_set(key_name=MM_WALLET.name) + next_epoch(vega=vega) + referral_set_id = list(vega.list_referral_sets().keys())[0] + vega.apply_referral_code(key_name="Key 1", id=referral_set_id) + next_epoch(vega=vega) + + for _ in range(2): + submit_order(vega, "Key 1", market, "SIDE_BUY", 2, 110) + forward_time(vega, True if _ < 2 - 1 else False) + + return market + + +@pytest.mark.xdist_group(name="test_fees_referral_tier_2") +def test_fees_page_discount_program_my_trading_fees(page: Page): + page.goto("/#/fees") + expect(page.get_by_test_id(ADJUSTED_FEES)).to_have_text("8.04%-8.04%") + expect(page.get_by_test_id(TOTAL_FEE_BEFORE_DISCOUNT)).to_have_text( + "Total fee before discount10.05%-10.05%" + ) + expect(page.get_by_test_id(INFRASTRUCTURE_FEES)).to_have_text("Infrastructure0.05%") + expect(page.get_by_test_id(MAKER_FEES)).to_have_text("Maker10%") + expect(page.get_by_test_id(LIQUIDITY_FEES)).to_have_text("Liquidity0%-0%") + + +@pytest.mark.xdist_group(name="test_fees_referral_tier_2") +def test_fees_page_discount_program_total_discount(page: Page): + page.goto("/#/fees") + expect(page.get_by_test_id(TOTAL_DISCOUNT)).to_have_text("20%") + expect(page.get_by_test_id(VOLUME_DISCOUNT_ROW)).to_have_text("Volume discount0%") + expect(page.get_by_test_id(REFERRAL_DISCOUNT_ROW)).to_have_text( + "Referral discount20%" + ) + page.get_by_test_id(TOTAL_DISCOUNT).hover() + expect(page.get_by_test_id(TOOLTIP_CONTENT).nth(0)).to_have_text( + "The total discount is calculated according to the following formula: 1 - (1 - dvolume) ⋇ (1 - dreferral)" + ) + + +@pytest.mark.xdist_group(name="test_fees_referral_tier_2") +def test_fees_page_referral_discount_program_referral_benefits(page: Page): + page.goto("/#/fees") + expect(page.get_by_test_id(RUNNING_NOTIONAL_TAKER_VOLUME)).to_have_text("207") + expect(page.get_by_test_id(REQUIRED_FOR_NEXT_TIER)).not_to_be_visible() + + +@pytest.mark.xdist_group(name="test_fees_referral_tier_2") +def test_fees_page_discount_program_discount(page: Page): + page.goto("/#/fees") + expect(page.get_by_test_id(TIER_VALUE_0)).to_have_text("1") + expect(page.get_by_test_id(TIER_VALUE_1)).to_have_text("2") + expect(page.get_by_test_id(DISCOUNT_VALUE_0)).to_have_text("10%") + expect(page.get_by_test_id(DISCOUNT_VALUE_1)).to_have_text("20%") + expect(page.get_by_test_id(MIN_VOLUME_VALUE_0)).to_have_text("100") + expect(page.get_by_test_id(MIN_VOLUME_VALUE_1)).to_have_text("200") + + expect(page.get_by_test_id(REQUIRED_EPOCHS_VALUE_0)).to_have_text("1") + expect(page.get_by_test_id(REQUIRED_EPOCHS_VALUE_1)).to_have_text("2") + + expect(page.get_by_test_id("your-referral-tier-1").nth(1)).to_be_visible() + expect(page.get_by_test_id("your-referral-tier-1").nth(1)).to_have_text("Your tier") + + +@pytest.mark.xdist_group(name="test_fees_referral_tier_2") +def test_fees_page_discount_program_fees_by_market(page: Page): + page.goto("/#/fees") + pinned = page.locator(PINNED_ROW_LOCATOR) + row = page.locator(ROW_LOCATOR) + expect(pinned.locator(COL_CODE)).to_have_text("BTC:DAI_2023Futr") + expect(row.locator(COL_FEE_AFTER_DISCOUNT)).to_have_text("8.04%") + expect(row.locator(COL_INFRA_FEE)).to_have_text("0.05%") + expect(row.locator(COL_MAKER_FEE)).to_have_text("10%") + expect(row.locator(COL_LIQUIDITY_FEE)).to_have_text("0%") + expect(row.locator(COL_TOTAL_FEE)).to_have_text("10.05%") + + +@pytest.mark.xdist_group(name="test_fees_referral_tier_2") +def test_deal_ticket_discount_program( + page: Page, setup_market_with_referral_discount_program +): + page.goto(f"/#/markets/{setup_market_with_referral_discount_program}") + page.get_by_test_id(ORDER_SIZE).fill("1") + page.get_by_test_id(ORDER_PRICE).fill("1") + expect(page.get_by_test_id(DISCOUNT_PILL)).to_have_text("-20%") + page.get_by_test_id(FEES_TEXT).hover() + tooltip = page.get_by_test_id(TOOLTIP_CONTENT).first + expect(tooltip.get_by_test_id(INFRASTRUCTURE_FEE_FACTOR)).to_have_text("0.05%") + expect(tooltip.get_by_test_id(INFRASTRUCTURE_FEE_VALUE)).to_have_text("0.0005 tDAI") + expect(tooltip.get_by_test_id(LIQUIDITY_FEE_FACTOR)).to_have_text("0%") + expect(tooltip.get_by_test_id(LIQUIDITY_FEE_VALUE)).to_have_text("0.00 tDAI") + expect(tooltip.get_by_test_id(MAKER_FEE_FACTOR)).to_have_text("10%") + expect(tooltip.get_by_test_id(MAKER_FEE_VALUE)).to_have_text("0.10 tDAI") + expect(tooltip.get_by_test_id(SUBTOTAL_FEE_FACTOR)).to_have_text("10.05%") + expect(tooltip.get_by_test_id(SUBTOTAL_FEE_VALUE)).to_have_text("0.1005 tDAI") + expect(tooltip.get_by_test_id(DISCOUNT_FEE_FACTOR)).to_have_text("-20%") + expect(tooltip.get_by_test_id(DISCOUNT_FEE_VALUE)).to_have_text("-0.0201 tDAI") + expect(tooltip.get_by_test_id(TOTAL_FEE_VALUE)).to_have_text("0.0804 tDAI") + + +@pytest.mark.xdist_group(name="test_fees_referral_tier_2") +def test_fills_taker_discount_program( + page: Page, + setup_market_with_referral_discount_program, +): + page.goto(f"/#/markets/{setup_market_with_referral_discount_program}") + page.get_by_test_id(FILLS).click() + row = page.get_by_test_id(TAB_FILLS).locator(ROW_LOCATOR).first + expect(row.locator(COL_SIZE)).to_have_text("+2") + expect(row.locator(COL_PRICE)).to_have_text("103.50 tDAI") + expect(row.locator(COL_PRICE_1)).to_have_text("207.00 tDAI") + expect(row.locator(COL_AGGRESSOR)).to_have_text("Taker") + expect(row.locator(COL_FEE)).to_have_text("13.31424 tDAI") + expect(row.locator(COL_FEE_DISCOUNT)).to_have_text("4.1607 tDAI") + + +@pytest.mark.xdist_group(name="test_fees_referral_tier_2") +def test_fills_maker_discount_program( + vega: VegaServiceNull, + page: Page, + setup_market_with_referral_discount_program, +): + page.goto(f"/#/markets/{setup_market_with_referral_discount_program}") + change_keys(page, vega, MM_WALLET.name) + page.get_by_test_id(FILLS).click() + row = page.get_by_test_id(TAB_FILLS).locator(ROW_LOCATOR).first + expect(row.locator(COL_SIZE)).to_have_text("-2") + expect(row.locator(COL_PRICE)).to_have_text("103.50 tDAI") + expect(row.locator(COL_PRICE_1)).to_have_text("207.00 tDAI") + expect(row.locator(COL_AGGRESSOR)).to_have_text("Maker") + expect(row.locator(COL_FEE)).to_have_text("-13.248 tDAI") + expect(row.locator(COL_FEE_DISCOUNT)).to_have_text("4.14 tDAI") + + +@pytest.mark.xdist_group(name="test_fees_referral_tier_2") +def test_fills_maker_fee_tooltip_discount_program( + vega: VegaServiceNull, page: Page, setup_market_with_referral_discount_program +): + page.goto(f"/#/markets/{setup_market_with_referral_discount_program}") + change_keys(page, vega, MM_WALLET.name) + page.get_by_test_id(FILLS).click() + row = page.get_by_test_id(TAB_FILLS).locator(ROW_LOCATOR).first + # tbd - tooltip is not visible without this wait + page.wait_for_timeout(1000) + row.locator(COL_FEE).hover() + expect(page.get_by_test_id(FEE_BREAKDOWN_TOOLTIP)).to_have_text( + " If the market was activeFee revenue to be received by the maker, takers' fee discounts already applied.During continuous trading the maker pays no infrastructure and liquidity fees.Infrastructure fee0.00 tDAILiquidity fee0.00 tDAIMaker fee-13.248 tDAITotal fees-13.248 tDAI " + ) + + +@pytest.mark.xdist_group(name="test_fees_referral_tier_2") +def test_fills_taker_fee_tooltip_discount_program( + page: Page, + setup_market_with_referral_discount_program, +): + page.goto(f"/#/markets/{setup_market_with_referral_discount_program}") + page.get_by_test_id(FILLS).click() + row = page.get_by_test_id(TAB_FILLS).locator(ROW_LOCATOR).first + # tbd - tooltip is not visible without this wait + page.wait_for_timeout(1000) + row.locator(COL_FEE).hover() + expect(page.get_by_test_id(FEE_BREAKDOWN_TOOLTIP)).to_have_text( + "If the market was activeFee revenue to be received by the maker, takers' fee discounts already applied.During continuous trading the maker pays no infrastructure and liquidity fees.Infrastructure fee0.00 tDAILiquidity fee0.00 tDAIMaker fee-13.248 tDAITotal fees-13.248 tDAI " + ) diff --git a/apps/trading/e2e/tests/fees/test_fees_volume_discount_tier_1.py b/apps/trading/e2e/tests/fees/test_fees_volume_discount_tier_1.py new file mode 100644 index 000000000..3f037ecba --- /dev/null +++ b/apps/trading/e2e/tests/fees/test_fees_volume_discount_tier_1.py @@ -0,0 +1,210 @@ +import pytest +from fees_test_ids import * +from playwright.sync_api import Page, expect +from vega_sim.null_service import VegaServiceNull +from actions.vega import submit_order +from wallet_config import MM_WALLET +from conftest import ( + init_vega, + init_page, + auth_setup, + risk_accepted_setup, + cleanup_container, +) +from actions.utils import next_epoch, change_keys, forward_time +from fixtures.market import setup_continuous_market + + +@pytest.fixture(scope="module") +def vega(request): + with init_vega(request) as vega_instance: + request.addfinalizer( + lambda: cleanup_container(vega_instance) + ) + yield vega_instance + + +@pytest.fixture(scope="module") +def page(vega, browser, request): + with init_page(vega, browser, request) as page: + risk_accepted_setup(page) + auth_setup(vega, page) + yield page + + +@pytest.fixture(scope="module", autouse=True) +def setup_market_with_volume_discount_program(vega: VegaServiceNull): + market = setup_continuous_market(vega, custom_quantum=100000) + vega.update_volume_discount_program( + proposal_key=MM_WALLET.name, + benefit_tiers=[ + { + "minimum_running_notional_taker_volume": 100, + "volume_discount_factor": 0.1, + }, + { + "minimum_running_notional_taker_volume": 200, + "volume_discount_factor": 0.2, + }, + ], + window_length=7, + ) + next_epoch(vega=vega) + + for _ in range(2): + submit_order(vega, "Key 1", market, "SIDE_BUY", 1, 110) + forward_time(vega, True if _ < 2 - 1 else False) + return market + + +@pytest.mark.xdist_group(name="test_fees_volume_tier_1") +def test_fees_page_discount_program_my_trading_fees(page: Page): + page.goto("/#/fees") + expect(page.get_by_test_id(ADJUSTED_FEES)).to_have_text("9.045%-9.045%") + expect(page.get_by_test_id(TOTAL_FEE_BEFORE_DISCOUNT)).to_have_text( + "Total fee before discount10.05%-10.05%" + ) + expect(page.get_by_test_id(INFRASTRUCTURE_FEES)).to_have_text("Infrastructure0.05%") + expect(page.get_by_test_id(MAKER_FEES)).to_have_text("Maker10%") + expect(page.get_by_test_id(LIQUIDITY_FEES)).to_have_text("Liquidity0%-0%") + + +@pytest.mark.xdist_group(name="test_fees_volume_tier_1") +def test_fees_page_discount_program_total_discount( + page: Page, +): + page.goto("/#/fees") + expect(page.get_by_test_id(TOTAL_DISCOUNT)).to_have_text("10%") + expect(page.get_by_test_id(VOLUME_DISCOUNT_ROW)).to_have_text("Volume discount10%") + expect(page.get_by_test_id(REFERRAL_DISCOUNT_ROW)).to_have_text( + "Referral discount0%" + ) + page.get_by_test_id(TOTAL_DISCOUNT).hover() + expect(page.get_by_test_id(TOOLTIP_CONTENT).nth(0)).to_have_text( + "The total discount is calculated according to the following formula: 1 - (1 - dvolume) ⋇ (1 - dreferral)" + ) + + +@pytest.mark.xdist_group(name="test_fees_volume_tier_1") +def test_fees_page_volume_discount_program_my_current_volume( + page: Page, +): + page.goto("/#/fees") + expect(page.get_by_test_id(PAST_EPOCHS_VOLUME)).to_have_text("103") + + expect(page.get_by_test_id(REQUIRED_FOR_NEXT_TIER)).to_have_text("97") + + +@pytest.mark.xdist_group(name="test_fees_volume_tier_1") +def test_fees_page_discount_program_discount( + page: Page, +): + page.goto("/#/fees") + expect(page.get_by_test_id(TIER_VALUE_0)).to_have_text("1") + expect(page.get_by_test_id(TIER_VALUE_1)).to_have_text("2") + expect(page.get_by_test_id(DISCOUNT_VALUE_0)).to_have_text("10%") + expect(page.get_by_test_id(DISCOUNT_VALUE_1)).to_have_text("20%") + expect(page.get_by_test_id(MIN_VOLUME_VALUE_0)).to_have_text("100") + expect(page.get_by_test_id(MIN_VOLUME_VALUE_1)).to_have_text("200") + expect(page.get_by_test_id("my-volume-value-0")).to_have_text("103") + expect(page.get_by_test_id("your-volume-tier-0").nth(1)).to_be_visible() + expect(page.get_by_test_id("your-volume-tier-0").nth(1)).to_have_text("Your tier") + + +@pytest.mark.xdist_group(name="test_fees_volume_tier_1") +def test_fees_page_discount_program_fees_by_market(page: Page): + page.goto("/#/fees") + pinned = page.locator(PINNED_ROW_LOCATOR) + row = page.locator(ROW_LOCATOR) + expect(pinned.locator(COL_CODE)).to_have_text("BTC:DAI_2023Futr") + expect(row.locator(COL_FEE_AFTER_DISCOUNT)).to_have_text("9.045%") + expect(row.locator(COL_INFRA_FEE)).to_have_text("0.05%") + expect(row.locator(COL_MAKER_FEE)).to_have_text("10%") + expect(row.locator(COL_LIQUIDITY_FEE)).to_have_text("0%") + expect(row.locator(COL_TOTAL_FEE)).to_have_text("10.05%") + + +@pytest.mark.xdist_group(name="test_fees_volume_tier_1") +def test_deal_ticket_discount_program_testing( + page: Page, setup_market_with_volume_discount_program +): + page.goto(f"/#/markets/{setup_market_with_volume_discount_program}") + page.get_by_test_id(ORDER_SIZE).fill("1") + page.get_by_test_id(ORDER_PRICE).fill("1") + expect(page.get_by_test_id(DISCOUNT_PILL)).to_have_text("-10%") + page.get_by_test_id(FEES_TEXT).hover() + tooltip = page.get_by_test_id(TOOLTIP_CONTENT).first + expect(tooltip.get_by_test_id(INFRASTRUCTURE_FEE_FACTOR)).to_have_text("0.05%") + expect(tooltip.get_by_test_id(INFRASTRUCTURE_FEE_VALUE)).to_have_text("0.0005 tDAI") + expect(tooltip.get_by_test_id(LIQUIDITY_FEE_FACTOR)).to_have_text("0%") + expect(tooltip.get_by_test_id(LIQUIDITY_FEE_VALUE)).to_have_text("0.00 tDAI") + expect(tooltip.get_by_test_id(MAKER_FEE_FACTOR)).to_have_text("10%") + expect(tooltip.get_by_test_id(MAKER_FEE_VALUE)).to_have_text("0.10 tDAI") + expect(tooltip.get_by_test_id(SUBTOTAL_FEE_FACTOR)).to_have_text("10.05%") + expect(tooltip.get_by_test_id(SUBTOTAL_FEE_VALUE)).to_have_text("0.1005 tDAI") + expect(tooltip.get_by_test_id(DISCOUNT_FEE_FACTOR)).to_have_text("-10%") + expect(tooltip.get_by_test_id(DISCOUNT_FEE_VALUE)).to_have_text("-0.01005 tDAI") + expect(tooltip.get_by_test_id(TOTAL_FEE_VALUE)).to_have_text("0.09045 tDAI") + + +@pytest.mark.xdist_group(name="test_fees_volume_tier_1") +def test_fills_taker_discount_program( + page: Page, setup_market_with_volume_discount_program +): + page.goto(f"/#/markets/{setup_market_with_volume_discount_program}") + page.get_by_test_id(FILLS).click() + row = page.get_by_test_id(TAB_FILLS).locator(ROW_LOCATOR).first + expect(row.locator(COL_SIZE)).to_have_text("+1") + expect(row.locator(COL_PRICE)).to_have_text("103.50 tDAI") + expect(row.locator(COL_PRICE_1)).to_have_text("103.50 tDAI") + expect(row.locator(COL_AGGRESSOR)).to_have_text("Taker") + expect(row.locator(COL_FEE)).to_have_text("9.36158 tDAI") + expect(row.locator(COL_FEE_DISCOUNT)).to_have_text("1.04017 tDAI") + + +@pytest.mark.xdist_group(name="test_fees_volume_tier_1") +def test_fills_maker_discount_program( + page: Page, setup_market_with_volume_discount_program, vega: VegaServiceNull +): + page.goto(f"/#/markets/{setup_market_with_volume_discount_program}") + change_keys(page, vega, MM_WALLET.name) + page.get_by_test_id(FILLS).click() + row = page.get_by_test_id(TAB_FILLS).locator(ROW_LOCATOR).first + expect(row.locator(COL_SIZE)).to_have_text("-1") + expect(row.locator(COL_PRICE)).to_have_text("103.50 tDAI") + expect(row.locator(COL_PRICE_1)).to_have_text("103.50 tDAI") + expect(row.locator(COL_AGGRESSOR)).to_have_text("Maker") + expect(row.locator(COL_FEE)).to_have_text("-9.315 tDAI") + expect(row.locator(COL_FEE_DISCOUNT)).to_have_text("1.035 tDAI") + + +@pytest.mark.xdist_group(name="test_fees_volume_tier_1") +def test_fills_maker_fee_tooltip_discount_program( + vega: VegaServiceNull, page: Page, setup_market_with_volume_discount_program +): + page.goto(f"/#/markets/{setup_market_with_volume_discount_program}") + change_keys(page, vega, MM_WALLET.name) + page.get_by_test_id(FILLS).click() + row = page.get_by_test_id(TAB_FILLS).locator(ROW_LOCATOR).first + # tbd - tooltip is not visible without this wait + page.wait_for_timeout(1000) + row.locator(COL_FEE).hover() + expect(page.get_by_test_id(FEE_BREAKDOWN_TOOLTIP)).to_have_text( + "If the market was activeFee revenue to be received by the maker, takers' fee discounts already applied.During continuous trading the maker pays no infrastructure and liquidity fees.Infrastructure fee0.00 tDAILiquidity fee0.00 tDAIMaker fee-9.315 tDAITotal fees-9.315 tDAI" + ) + + +@pytest.mark.xdist_group(name="test_fees_volume_tier_1") +def test_fills_taker_fee_tooltip_discount_program( + page: Page, + setup_market_with_volume_discount_program, +): + page.goto(f"/#/markets/{setup_market_with_volume_discount_program}") + page.get_by_test_id(FILLS).click() + row = page.get_by_test_id(TAB_FILLS).locator(ROW_LOCATOR).first + # tbd - tooltip is not visible without this wait + page.wait_for_timeout(1000) + row.locator(COL_FEE).hover() + expect(page.get_by_test_id(FEE_BREAKDOWN_TOOLTIP)).to_have_text( + "If the market was activeFee revenue to be received by the maker, takers' fee discounts already applied.During continuous trading the maker pays no infrastructure and liquidity fees.Infrastructure fee0.00 tDAILiquidity fee0.00 tDAIMaker fee-9.315 tDAITotal fees-9.315 tDAI" + ) diff --git a/apps/trading/e2e/tests/fees/test_fees_volume_discount_tier_2.py b/apps/trading/e2e/tests/fees/test_fees_volume_discount_tier_2.py new file mode 100644 index 000000000..71590c20d --- /dev/null +++ b/apps/trading/e2e/tests/fees/test_fees_volume_discount_tier_2.py @@ -0,0 +1,209 @@ +import pytest +from fees_test_ids import * +from playwright.sync_api import Page, expect +from vega_sim.null_service import VegaServiceNull +from actions.vega import submit_order +from wallet_config import MM_WALLET +from conftest import ( + init_vega, + init_page, + auth_setup, + risk_accepted_setup, + cleanup_container, +) +from actions.utils import next_epoch, change_keys, forward_time +from fixtures.market import setup_continuous_market + +@pytest.fixture(scope="module") +def vega(request): + with init_vega(request) as vega_instance: + request.addfinalizer( + lambda: cleanup_container(vega_instance) + ) + yield vega_instance + + +@pytest.fixture(scope="module") +def page(vega, browser, request): + with init_page(vega, browser, request) as page: + risk_accepted_setup(page) + auth_setup(vega, page) + yield page + + +@pytest.fixture(scope="module", autouse=True) +def setup_market_with_volume_discount_program(vega: VegaServiceNull): + market = setup_continuous_market(vega, custom_quantum=100000) + vega.update_volume_discount_program( + proposal_key=MM_WALLET.name, + benefit_tiers=[ + { + "minimum_running_notional_taker_volume": 100, + "volume_discount_factor": 0.1, + }, + { + "minimum_running_notional_taker_volume": 200, + "volume_discount_factor": 0.2, + }, + ], + window_length=7, + ) + next_epoch(vega=vega) + + for _ in range(3): + submit_order(vega, "Key 1", market, "SIDE_BUY", 1, 110) + forward_time(vega, True if _ < 3 - 1 else False) + + return market + + +@pytest.mark.xdist_group(name="test_fees_volume_tier_2") +def test_fees_page_discount_program_my_trading_fees(page: Page): + page.goto("/#/fees") + expect(page.get_by_test_id(ADJUSTED_FEES)).to_have_text("8.04%-8.04%") + expect(page.get_by_test_id(TOTAL_FEE_BEFORE_DISCOUNT)).to_have_text( + "Total fee before discount10.05%-10.05%" + ) + expect(page.get_by_test_id(INFRASTRUCTURE_FEES)).to_have_text("Infrastructure0.05%") + expect(page.get_by_test_id(MAKER_FEES)).to_have_text("Maker10%") + expect(page.get_by_test_id(LIQUIDITY_FEES)).to_have_text("Liquidity0%-0%") + + +@pytest.mark.xdist_group(name="test_fees_volume_tier_2") +def test_fees_page_discount_program_total_discount(page: Page): + page.goto("/#/fees") + expect(page.get_by_test_id(TOTAL_DISCOUNT)).to_have_text("20%") + expect(page.get_by_test_id(VOLUME_DISCOUNT_ROW)).to_have_text("Volume discount20%") + expect(page.get_by_test_id(REFERRAL_DISCOUNT_ROW)).to_have_text( + "Referral discount0%" + ) + page.get_by_test_id(TOTAL_DISCOUNT).hover() + expect(page.get_by_test_id(TOOLTIP_CONTENT).nth(0)).to_have_text( + "The total discount is calculated according to the following formula: 1 - (1 - dvolume) ⋇ (1 - dreferral)" + ) + + +@pytest.mark.xdist_group(name="test_fees_volume_tier_2") +def test_fees_page_volume_discount_program_my_current_volume(page: Page): + page.goto("/#/fees") + expect(page.get_by_test_id(PAST_EPOCHS_VOLUME)).to_have_text("206") + expect(page.get_by_test_id(REQUIRED_FOR_NEXT_TIER)).not_to_be_visible() + + +@pytest.mark.xdist_group(name="test_fees_volume_tier_2") +def test_fees_page_discount_program_discount(page: Page): + page.goto("/#/fees") + expect(page.get_by_test_id(TIER_VALUE_0)).to_have_text("1") + expect(page.get_by_test_id(TIER_VALUE_1)).to_have_text("2") + expect(page.get_by_test_id(DISCOUNT_VALUE_0)).to_have_text("10%") + expect(page.get_by_test_id(DISCOUNT_VALUE_1)).to_have_text("20%") + expect(page.get_by_test_id(MIN_VOLUME_VALUE_0)).to_have_text("100") + expect(page.get_by_test_id(MIN_VOLUME_VALUE_1)).to_have_text("200") + expect(page.get_by_test_id("my-volume-value-1")).to_have_text("206") + expect(page.get_by_test_id("your-volume-tier-1").nth(1)).to_be_visible() + expect(page.get_by_test_id("your-volume-tier-1").nth(1)).to_have_text("Your tier") + + +@pytest.mark.xdist_group(name="test_fees_volume_tier_2") +def test_fees_page_discount_program_fees_by_market(page: Page): + page.goto("/#/fees") + pinned = page.locator(PINNED_ROW_LOCATOR) + row = page.locator(ROW_LOCATOR) + expect(pinned.locator(COL_CODE)).to_have_text("BTC:DAI_2023Futr") + expect(row.locator(COL_FEE_AFTER_DISCOUNT)).to_have_text("8.04%") + expect(row.locator(COL_INFRA_FEE)).to_have_text("0.05%") + expect(row.locator(COL_MAKER_FEE)).to_have_text("10%") + expect(row.locator(COL_LIQUIDITY_FEE)).to_have_text("0%") + expect(row.locator(COL_TOTAL_FEE)).to_have_text("10.05%") + + +@pytest.mark.xdist_group(name="test_fees_volume_tier_2") +def test_deal_ticket_discount_program( + page: Page, + setup_market_with_volume_discount_program, +): + page.goto(f"/#/markets/{setup_market_with_volume_discount_program}") + page.get_by_test_id(ORDER_SIZE).fill("1") + page.get_by_test_id(ORDER_PRICE).fill("1") + expect(page.get_by_test_id(DISCOUNT_PILL)).to_have_text("-20%") + page.get_by_test_id(FEES_TEXT).hover() + tooltip = page.get_by_test_id(TOOLTIP_CONTENT).first + expect(tooltip.get_by_test_id(INFRASTRUCTURE_FEE_FACTOR)).to_have_text("0.05%") + expect(tooltip.get_by_test_id(INFRASTRUCTURE_FEE_VALUE)).to_have_text("0.0005 tDAI") + expect(tooltip.get_by_test_id(LIQUIDITY_FEE_FACTOR)).to_have_text("0%") + expect(tooltip.get_by_test_id(LIQUIDITY_FEE_VALUE)).to_have_text("0.00 tDAI") + expect(tooltip.get_by_test_id(MAKER_FEE_FACTOR)).to_have_text("10%") + expect(tooltip.get_by_test_id(MAKER_FEE_VALUE)).to_have_text("0.10 tDAI") + expect(tooltip.get_by_test_id(SUBTOTAL_FEE_FACTOR)).to_have_text("10.05%") + expect(tooltip.get_by_test_id(SUBTOTAL_FEE_VALUE)).to_have_text("0.1005 tDAI") + expect(tooltip.get_by_test_id(DISCOUNT_FEE_FACTOR)).to_have_text("-20%") + expect(tooltip.get_by_test_id(DISCOUNT_FEE_VALUE)).to_have_text("-0.0201 tDAI") + expect(tooltip.get_by_test_id(TOTAL_FEE_VALUE)).to_have_text("0.0804 tDAI") + + +@pytest.mark.xdist_group(name="test_fees_volume_tier_2") +def test_fills_taker_discount_program( + page: Page, + setup_market_with_volume_discount_program, +): + page.goto(f"/#/markets/{setup_market_with_volume_discount_program}") + page.get_by_test_id(FILLS).click() + row = page.get_by_test_id(TAB_FILLS).locator(ROW_LOCATOR).first + expect(row.locator(COL_SIZE)).to_have_text("+1") + expect(row.locator(COL_PRICE)).to_have_text("103.50 tDAI") + expect(row.locator(COL_PRICE_1)).to_have_text("103.50 tDAI") + expect(row.locator(COL_AGGRESSOR)).to_have_text("Taker") + expect(row.locator(COL_FEE)).to_have_text( + "8.3214 tDAI", + ) + expect(row.locator(COL_FEE_DISCOUNT)).to_have_text("2.08035 tDAI") + + +@pytest.mark.xdist_group(name="test_fees_volume_tier_2") +def test_fills_maker_discount_program( + vega: VegaServiceNull, + page: Page, + setup_market_with_volume_discount_program, +): + page.goto(f"/#/markets/{setup_market_with_volume_discount_program}") + change_keys(page, vega, MM_WALLET.name) + page.get_by_test_id(FILLS).click() + row = page.get_by_test_id(TAB_FILLS).locator(ROW_LOCATOR).first + expect(row.locator(COL_SIZE)).to_have_text("-1") + expect(row.locator(COL_PRICE)).to_have_text("103.50 tDAI") + expect(row.locator(COL_PRICE_1)).to_have_text("103.50 tDAI") + expect(row.locator(COL_AGGRESSOR)).to_have_text("Maker") + expect(row.locator(COL_FEE)).to_have_text("-8.28 tDAI ") + expect(row.locator(COL_FEE_DISCOUNT)).to_have_text("2.07 tDAI") + + +@pytest.mark.xdist_group(name="test_fees_volume_tier_2") +def test_fills_maker_fee_tooltip_discount_program( + vega, page: Page, setup_market_with_volume_discount_program +): + page.goto(f"/#/markets/{setup_market_with_volume_discount_program}") + change_keys(page, vega, MM_WALLET.name) + page.get_by_test_id(FILLS).click() + row = page.get_by_test_id(TAB_FILLS).locator(ROW_LOCATOR).first + # tbd - tooltip is not visible without this wait + page.wait_for_timeout(1000) + row.locator(COL_FEE).hover() + expect(page.get_by_test_id(FEE_BREAKDOWN_TOOLTIP)).to_have_text( + "If the market was activeFee revenue to be received by the maker, takers' fee discounts already applied.During continuous trading the maker pays no infrastructure and liquidity fees.Infrastructure fee0.00 tDAILiquidity fee0.00 tDAIMaker fee-8.28 tDAITotal fees-8.28 tDAI" + ) + + +@pytest.mark.xdist_group(name="test_fees_volume_tier_2") +def test_fills_taker_fee_tooltip_discount_program( + page: Page, + setup_market_with_volume_discount_program, +): + page.goto(f"/#/markets/{setup_market_with_volume_discount_program}") + page.get_by_test_id(FILLS).click() + row = page.get_by_test_id(TAB_FILLS).locator(ROW_LOCATOR).first + # tbd - tooltip is not visible without this wait + page.wait_for_timeout(1000) + row.locator(COL_FEE).hover() + expect(page.get_by_test_id(FEE_BREAKDOWN_TOOLTIP)).to_have_text( + "If the market was activeFee revenue to be received by the maker, takers' fee discounts already applied.During continuous trading the maker pays no infrastructure and liquidity fees.Infrastructure fee0.00 tDAILiquidity fee0.00 tDAIMaker fee-8.28 tDAITotal fees-8.28 tDAI " + ) diff --git a/apps/trading/e2e/tests/get_started/test_get_started.py b/apps/trading/e2e/tests/get_started/test_get_started.py index 478e2e045..34438813a 100644 --- a/apps/trading/e2e/tests/get_started/test_get_started.py +++ b/apps/trading/e2e/tests/get_started/test_get_started.py @@ -14,7 +14,7 @@ logger = logging.getLogger() @pytest.fixture(scope="class") def vega(request): with init_vega(request) as vega_instance: - request.addfinalizer(lambda: cleanup_container(vega_instance)) # Register the cleanup function + request.addfinalizer(lambda: cleanup_container(vega_instance)) yield vega_instance @@ -142,8 +142,7 @@ class TestGetStarted: def test_get_started_seen_already(self, simple_market, page: Page): page.goto(f"/#/markets/{simple_market}") get_started_locator = page.get_by_test_id("connect-vega-wallet") - page.wait_for_selector( - '[data-testid="connect-vega-wallet"]', state="attached") + page.wait_for_selector('[data-testid="connect-vega-wallet"]', state="attached") expect(get_started_locator).to_be_enabled expect(get_started_locator).to_be_visible # 0007-FUGS-015 @@ -153,7 +152,9 @@ class TestGetStarted: expect(page.get_by_test_id("dialog-content").nth(1)).to_be_visible() @pytest.mark.skip("tbd-market-sim") - def test_redirect_default_market(self, continuous_market, vega: VegaServiceNull, page: Page): + def test_redirect_default_market( + self, continuous_market, vega: VegaServiceNull, page: Page + ): page.goto("/") # 0007-FUGS-012 expect(page).to_have_url( diff --git a/apps/trading/e2e/tests/liquidity_provision/test_liquidity_provision.py b/apps/trading/e2e/tests/liquidity_provision/test_liquidity_provision.py index 803f8e993..9688155e3 100644 --- a/apps/trading/e2e/tests/liquidity_provision/test_liquidity_provision.py +++ b/apps/trading/e2e/tests/liquidity_provision/test_liquidity_provision.py @@ -8,7 +8,7 @@ from actions.utils import next_epoch, truncate_middle, change_keys @pytest.fixture(scope="module") def vega(request): with init_vega(request) as vega_instance: - request.addfinalizer(lambda: cleanup_container(vega_instance)) # Register the cleanup function + request.addfinalizer(lambda: cleanup_container(vega_instance)) yield vega_instance diff --git a/apps/trading/e2e/tests/market/test_closed_markets.py b/apps/trading/e2e/tests/market/test_closed_markets.py index 876fdfc9a..f6b4e0a56 100644 --- a/apps/trading/e2e/tests/market/test_closed_markets.py +++ b/apps/trading/e2e/tests/market/test_closed_markets.py @@ -11,7 +11,7 @@ from actions.utils import next_epoch @pytest.fixture(scope="class") def vega(request): with init_vega(request) as vega_instance: - request.addfinalizer(lambda: cleanup_container(vega_instance)) # Register the cleanup function + request.addfinalizer(lambda: cleanup_container(vega_instance)) yield vega_instance diff --git a/apps/trading/e2e/tests/market/test_market_info.py b/apps/trading/e2e/tests/market/test_market_info.py index e729efdf0..fa9682226 100644 --- a/apps/trading/e2e/tests/market/test_market_info.py +++ b/apps/trading/e2e/tests/market/test_market_info.py @@ -11,7 +11,7 @@ market_title_test_id = "accordion-title" @pytest.fixture(scope="module") def vega(request): with init_vega(request) as vega_instance: - request.addfinalizer(lambda: cleanup_container(vega_instance)) # Register the cleanup function + request.addfinalizer(lambda: cleanup_container(vega_instance)) yield vega_instance diff --git a/apps/trading/e2e/tests/market/test_markets_proposed.py b/apps/trading/e2e/tests/market/test_markets_proposed.py index b1a48a67c..81531ddb8 100644 --- a/apps/trading/e2e/tests/market/test_markets_proposed.py +++ b/apps/trading/e2e/tests/market/test_markets_proposed.py @@ -14,7 +14,7 @@ col_market_id = '[col-id="market"] [data-testid="stack-cell-primary"]' @pytest.fixture(scope="module") def vega(request): with init_vega(request) as vega_instance: - request.addfinalizer(lambda: cleanup_container(vega_instance)) # Register the cleanup function + request.addfinalizer(lambda: cleanup_container(vega_instance)) yield vega_instance diff --git a/apps/trading/e2e/tests/market/test_monitoring_auction_price_volatility_market.py b/apps/trading/e2e/tests/market/test_monitoring_auction_price_volatility_market.py index d4287e747..9468371df 100644 --- a/apps/trading/e2e/tests/market/test_monitoring_auction_price_volatility_market.py +++ b/apps/trading/e2e/tests/market/test_monitoring_auction_price_volatility_market.py @@ -16,7 +16,7 @@ COL_ID_FEE = ".ag-center-cols-container [col-id='fee'] .ag-cell-value" @pytest.fixture(scope="module") def vega(request): with init_vega(request) as vega_instance: - request.addfinalizer(lambda: cleanup_container(vega_instance)) # Register the cleanup function + request.addfinalizer(lambda: cleanup_container(vega_instance)) yield vega_instance diff --git a/apps/trading/e2e/tests/navigation/test_navigation.py b/apps/trading/e2e/tests/navigation/test_navigation.py index 0044c105e..461d74a3e 100644 --- a/apps/trading/e2e/tests/navigation/test_navigation.py +++ b/apps/trading/e2e/tests/navigation/test_navigation.py @@ -7,11 +7,10 @@ from conftest import init_page, init_vega, cleanup_container @pytest.fixture(scope="module") def vega(request): with init_vega(request) as vega_instance: - request.addfinalizer(lambda: cleanup_container(vega_instance)) # Register the cleanup function + request.addfinalizer(lambda: cleanup_container(vega_instance)) yield vega_instance -# we can reuse single page instance in all tests @pytest.fixture(scope="module") def page(vega, browser, request): with init_page(vega, browser, request) as page: diff --git a/apps/trading/e2e/tests/orderbook/test_orderbook.py b/apps/trading/e2e/tests/orderbook/test_orderbook.py index 698292a3d..c1bd4827a 100644 --- a/apps/trading/e2e/tests/orderbook/test_orderbook.py +++ b/apps/trading/e2e/tests/orderbook/test_orderbook.py @@ -10,7 +10,7 @@ from wallet_config import MM_WALLET, MM_WALLET2 @pytest.fixture(scope="module") def vega(request): with init_vega(request) as vega_instance: - request.addfinalizer(lambda: cleanup_container(vega_instance)) # Register the cleanup function + request.addfinalizer(lambda: cleanup_container(vega_instance)) yield vega_instance diff --git a/apps/trading/e2e/tests/perpetual_market/test_perpetuals.py b/apps/trading/e2e/tests/perpetual_market/test_perpetuals.py index 89bbb38f3..252a41872 100644 --- a/apps/trading/e2e/tests/perpetual_market/test_perpetuals.py +++ b/apps/trading/e2e/tests/perpetual_market/test_perpetuals.py @@ -18,7 +18,7 @@ class TestPerpetuals: @pytest.fixture(scope="class") def vega(self, request): with init_vega(request) as vega_instance: - request.addfinalizer(lambda: cleanup_container(vega_instance)) # Register the cleanup function + request.addfinalizer(lambda: cleanup_container(vega_instance)) yield vega_instance @pytest.fixture(scope="class") diff --git a/apps/trading/e2e/tests/positions/test_collateral.py b/apps/trading/e2e/tests/positions/test_collateral.py index 8fa86dfe0..34d2ddc66 100644 --- a/apps/trading/e2e/tests/positions/test_collateral.py +++ b/apps/trading/e2e/tests/positions/test_collateral.py @@ -12,7 +12,7 @@ COL_ID_USED = ".ag-center-cols-container [col-id='used'] .ag-cell-value" @pytest.fixture(scope="module") def vega(request): with init_vega(request) as vega_instance: - request.addfinalizer(lambda: cleanup_container(vega_instance)) # Register the cleanup function + request.addfinalizer(lambda: cleanup_container(vega_instance)) yield vega_instance diff --git a/apps/trading/e2e/tests/referrals/test_referrals.py b/apps/trading/e2e/tests/referrals/test_referrals.py index 53f276df7..74dd00087 100644 --- a/apps/trading/e2e/tests/referrals/test_referrals.py +++ b/apps/trading/e2e/tests/referrals/test_referrals.py @@ -15,7 +15,7 @@ BUY_ORDERS = [[1, 106], [1, 107], [1, 108]] @pytest.fixture(scope="module") def vega(request): with init_vega(request) as vega_instance: - request.addfinalizer(lambda: cleanup_container(vega_instance)) # Register the cleanup function + request.addfinalizer(lambda: cleanup_container(vega_instance)) yield vega_instance diff --git a/apps/trading/e2e/tests/rewards/rewards_test_ids.py b/apps/trading/e2e/tests/rewards/rewards_test_ids.py new file mode 100644 index 000000000..090baba02 --- /dev/null +++ b/apps/trading/e2e/tests/rewards/rewards_test_ids.py @@ -0,0 +1,62 @@ +from actions.utils import create_and_faucet_wallet +from wallet_config import WalletConfig +# region Constants +ACTIVITY = "activity" +HOARDER = "hoarder" +COMBO = "combo" + +REWARDS_URL = "/#/rewards" + +# test IDs +COMBINED_MULTIPLIERS = "combined-multipliers" +TOTAL_REWARDS = "total-rewards" +PRICE_TAKING_COL_ID = '[col-id="priceTaking"]' +TOTAL_COL_ID = '[col-id="total"]' +ROW = "row" +STREAK_REWARD_MULTIPLIER_VALUE = "streak-reward-multiplier-value" +HOARDER_REWARD_MULTIPLIER_VALUE = "hoarder-reward-multiplier-value" +HOARDER_BONUS_TOTAL_HOARDED = "hoarder-bonus-total-hoarded" +EARNED_BY_ME_BUTTON = "earned-by-me-button" +TRANSFER_AMOUNT = "transfer-amount" +EPOCH_STREAK = "epoch-streak" + +# endregion + +# Keys +PARTY_A = "PARTY_A" +PARTY_B = "PARTY_B" +PARTY_C = "PARTY_C" +PARTY_D = "PARTY_D" + +ACTIVITY_STREAKS = """ +{ + "tiers": [ + { + "minimum_activity_streak": 2, + "reward_multiplier": "2.0", + "vesting_multiplier": "1.1" + } + ] +} +""" +VESTING = """ +{ + "tiers": [ + { + "minimum_quantum_balance": "10000000", + "reward_multiplier": "2" + } + ] +} +""" + +def keys(vega): + PARTY_A = WalletConfig("PARTY_A", "PARTY_A") + create_and_faucet_wallet(vega=vega, wallet=PARTY_A) + PARTY_B = WalletConfig("PARTY_B", "PARTY_B") + create_and_faucet_wallet(vega=vega, wallet=PARTY_B) + PARTY_C = WalletConfig("PARTY_C", "PARTY_C") + create_and_faucet_wallet(vega=vega, wallet=PARTY_C) + PARTY_D = WalletConfig("PARTY_D", "PARTY_D") + create_and_faucet_wallet(vega=vega, wallet=PARTY_D) + return PARTY_A, PARTY_B, PARTY_C, PARTY_D diff --git a/apps/trading/e2e/tests/rewards/test_hoarder_tier_0.py b/apps/trading/e2e/tests/rewards/test_hoarder_tier_0.py new file mode 100644 index 000000000..d608069f0 --- /dev/null +++ b/apps/trading/e2e/tests/rewards/test_hoarder_tier_0.py @@ -0,0 +1,121 @@ +import pytest +import vega_sim.proto.vega as vega_protos +from rewards_test_ids import * +from playwright.sync_api import Page, expect +from conftest import init_vega, init_page, auth_setup, risk_accepted_setup, cleanup_container +from fixtures.market import setup_continuous_market +from actions.utils import next_epoch, change_keys +from wallet_config import MM_WALLET +from vega_sim.null_service import VegaServiceNull + + +@pytest.fixture(scope="module") +def vega(request): + with init_vega(request) as vega_instance: + request.addfinalizer(lambda: cleanup_container(vega_instance)) + yield vega_instance + +@pytest.fixture(scope="module") +def page(vega, browser, request): + with init_page(vega, browser, request) as page: + risk_accepted_setup(page) + auth_setup(vega, page) + page.goto(REWARDS_URL) + change_keys(page, vega, PARTY_B) + yield page + + +@pytest.fixture(scope="module", autouse=True) +def setup_market_with_reward_program(vega: VegaServiceNull): + tDAI_market = setup_continuous_market(vega) + PARTY_A, PARTY_B, PARTY_C, PARTY_D = keys(vega) + tDAI_asset_id = vega.find_asset_id(symbol="tDAI") + vega.mint(key_name=PARTY_B.name, asset=tDAI_asset_id, amount=100000) + vega.mint(key_name=PARTY_C.name, asset=tDAI_asset_id, amount=100000) + vega.mint(key_name=PARTY_A.name, asset=tDAI_asset_id, amount=100000) + vega.mint(key_name=PARTY_D.name, asset=tDAI_asset_id, amount=100000) + next_epoch(vega=vega) + + vega.update_network_parameter( + proposal_key=MM_WALLET.name, + parameter="rewards.vesting.benefitTiers", + new_value=VESTING, + ) + next_epoch(vega=vega) + + tDAI_asset_id = vega.find_asset_id(symbol="tDAI") + vega.update_network_parameter( + MM_WALLET.name, parameter="reward.asset", new_value=tDAI_asset_id + ) + + next_epoch(vega=vega) + vega.recurring_transfer( + from_key_name=PARTY_A.name, + from_account_type=vega_protos.vega.ACCOUNT_TYPE_GENERAL, + to_account_type=vega_protos.vega.ACCOUNT_TYPE_REWARD_MAKER_PAID_FEES, + asset=tDAI_asset_id, + reference="reward", + asset_for_metric=tDAI_asset_id, + metric=vega_protos.vega.DISPATCH_METRIC_MAKER_FEES_PAID, + amount=100, + factor=1.0, + ) + vega.submit_order( + trading_key=PARTY_B.name, + market_id=tDAI_market, + order_type="TYPE_MARKET", + time_in_force="TIME_IN_FORCE_IOC", + side="SIDE_BUY", + volume=1, + ) + vega.submit_order( + trading_key=PARTY_A.name, + market_id=tDAI_market, + order_type="TYPE_MARKET", + time_in_force="TIME_IN_FORCE_IOC", + side="SIDE_BUY", + volume=1, + ) + vega.wait_fn(1) + vega.wait_for_total_catchup() + + next_epoch(vega=vega) + return tDAI_market, tDAI_asset_id + + +@pytest.mark.xdist_group(name="test_rewards_hoarder_tier_0") +def test_network_reward_pot( + page: Page, +): + expect(page.get_by_test_id(TOTAL_REWARDS)).to_have_text("50.00 tDAI") + + +@pytest.mark.xdist_group(name="test_rewards_hoarder_tier_0") +def test_reward_multiplier( + page: Page, +): + expect(page.get_by_test_id(COMBINED_MULTIPLIERS)).to_have_text("1x") + expect(page.get_by_test_id(STREAK_REWARD_MULTIPLIER_VALUE)).to_have_text("1x") + expect(page.get_by_test_id(HOARDER_REWARD_MULTIPLIER_VALUE)).to_have_text("1x") + + +@pytest.mark.xdist_group(name="test_rewards_hoarder_tier_0") +def test_hoarder_bonus( + page: Page, +): + expect(page.get_by_test_id(HOARDER_BONUS_TOTAL_HOARDED)).to_contain_text( + "5,000,000" + ) + + +@pytest.mark.xdist_group(name="test_rewards_hoarder_tier_0") +def test_reward_history( + page: Page, +): + page.locator('[name="fromEpoch"]').fill("1") + expect((page.get_by_role(ROW).locator(PRICE_TAKING_COL_ID)).nth(1)).to_have_text( + "100.00100.00%" + ) + expect((page.get_by_role(ROW).locator(TOTAL_COL_ID)).nth(1)).to_have_text("100.00") + page.get_by_test_id(EARNED_BY_ME_BUTTON).click() + expect((page.get_by_role(ROW).locator(TOTAL_COL_ID)).nth(1)).to_have_text("50.00") \ No newline at end of file diff --git a/apps/trading/e2e/tests/rewards/test_hoarder_tier_1.py b/apps/trading/e2e/tests/rewards/test_hoarder_tier_1.py new file mode 100644 index 000000000..ecb1c2765 --- /dev/null +++ b/apps/trading/e2e/tests/rewards/test_hoarder_tier_1.py @@ -0,0 +1,173 @@ +import pytest +from rewards_test_ids import * +import vega_sim.proto.vega as vega_protos +from playwright.sync_api import Page, expect +from conftest import init_vega, init_page, auth_setup, risk_accepted_setup, cleanup_container +from fixtures.market import setup_continuous_market +from actions.utils import next_epoch, change_keys +from wallet_config import MM_WALLET +from vega_sim.null_service import VegaServiceNull + + +@pytest.fixture(scope="module") +def vega(request): + with init_vega(request) as vega_instance: + request.addfinalizer(lambda: cleanup_container(vega_instance)) + yield vega_instance + + +@pytest.fixture(scope="module") +def page(vega, browser, request): + with init_page(vega, browser, request) as page: + risk_accepted_setup(page) + auth_setup(vega, page) + page.goto(REWARDS_URL) + change_keys(page, vega, PARTY_B) + yield page + + +@pytest.fixture(scope="module", autouse=True) +def setup_market_with_reward_program(vega: VegaServiceNull): + tDAI_market = setup_continuous_market(vega) + PARTY_A, PARTY_B, PARTY_C, PARTY_D = keys(vega) + tDAI_asset_id = vega.find_asset_id(symbol="tDAI") + vega.mint(key_name=PARTY_B.name, asset=tDAI_asset_id, amount=100000) + vega.mint(key_name=PARTY_C.name, asset=tDAI_asset_id, amount=100000) + vega.mint(key_name=PARTY_A.name, asset=tDAI_asset_id, amount=100000) + vega.mint(key_name=PARTY_D.name, asset=tDAI_asset_id, amount=100000) + next_epoch(vega=vega) + + vega.update_network_parameter( + proposal_key=MM_WALLET.name, + parameter="rewards.vesting.benefitTiers", + new_value=VESTING, + ) + next_epoch(vega=vega) + + tDAI_asset_id = vega.find_asset_id(symbol="tDAI") + vega.update_network_parameter( + MM_WALLET.name, parameter="reward.asset", new_value=tDAI_asset_id + ) + + next_epoch(vega=vega) + vega.recurring_transfer( + from_key_name=PARTY_A.name, + from_account_type=vega_protos.vega.ACCOUNT_TYPE_GENERAL, + to_account_type=vega_protos.vega.ACCOUNT_TYPE_REWARD_MAKER_PAID_FEES, + asset=tDAI_asset_id, + reference="reward", + asset_for_metric=tDAI_asset_id, + metric=vega_protos.vega.DISPATCH_METRIC_MAKER_FEES_PAID, + amount=100, + factor=1.0, + ) + vega.submit_order( + trading_key=PARTY_B.name, + market_id=tDAI_market, + order_type="TYPE_MARKET", + time_in_force="TIME_IN_FORCE_IOC", + side="SIDE_BUY", + volume=1, + ) + vega.submit_order( + trading_key=PARTY_A.name, + market_id=tDAI_market, + order_type="TYPE_MARKET", + time_in_force="TIME_IN_FORCE_IOC", + side="SIDE_BUY", + volume=1, + ) + vega.wait_fn(1) + vega.wait_for_total_catchup() + + next_epoch(vega=vega) + vega.submit_order( + trading_key=PARTY_B.name, + market_id=tDAI_market, + order_type="TYPE_LIMIT", + time_in_force="TIME_IN_FORCE_GTC", + side="SIDE_BUY", + price=1, + volume=1, + ) + next_epoch(vega=vega) + vega.submit_order( + trading_key=PARTY_B.name, + market_id=tDAI_market, + order_type="TYPE_MARKET", + time_in_force="TIME_IN_FORCE_IOC", + side="SIDE_BUY", + volume=1, + ) + vega.submit_order( + trading_key=PARTY_D.name, + market_id=tDAI_market, + order_type="TYPE_MARKET", + time_in_force="TIME_IN_FORCE_IOC", + side="SIDE_BUY", + volume=1, + ) + vega.wait_fn(1) + vega.wait_for_total_catchup() + next_epoch(vega=vega) + next_epoch(vega=vega) + vega.submit_order( + trading_key=PARTY_B.name, + market_id=tDAI_market, + order_type="TYPE_MARKET", + time_in_force="TIME_IN_FORCE_IOC", + side="SIDE_BUY", + volume=1, + ) + vega.submit_order( + trading_key=PARTY_D.name, + market_id=tDAI_market, + order_type="TYPE_MARKET", + time_in_force="TIME_IN_FORCE_IOC", + side="SIDE_BUY", + volume=1, + ) + vega.wait_fn(1) + vega.wait_for_total_catchup() + next_epoch(vega=vega) + next_epoch(vega=vega) + next_epoch(vega=vega) + return tDAI_market, tDAI_asset_id + + +@pytest.mark.xdist_group(name="test_rewards_hoarder_tier_1") +def test_network_reward_pot( + page: Page, +): + expect(page.get_by_test_id(TOTAL_REWARDS)).to_have_text("166.66666 tDAI") + + +@pytest.mark.xdist_group(name="test_rewards_hoarder_tier_1") +def test_reward_multiplier( + page: Page, +): + expect(page.get_by_test_id(COMBINED_MULTIPLIERS)).to_have_text("2x") + expect(page.get_by_test_id(STREAK_REWARD_MULTIPLIER_VALUE)).to_have_text("1x") + expect(page.get_by_test_id(HOARDER_REWARD_MULTIPLIER_VALUE)).to_have_text("2x") + + +@pytest.mark.xdist_group(name="test_rewards_hoarder_tier_1") +def test_hoarder_bonus(page: Page): + expect(page.get_by_test_id(HOARDER_BONUS_TOTAL_HOARDED)).to_contain_text( + "16,666,666" + ) + + +@pytest.mark.xdist_group(name="test_rewards_hoarder_tier_1") +def test_reward_history(page: Page): + page.locator('[name="fromEpoch"]').fill("1") + expect((page.get_by_role(ROW).locator(PRICE_TAKING_COL_ID)).nth(1)).to_have_text( + "299.99999100.00%" + ) + expect((page.get_by_role(ROW).locator(TOTAL_COL_ID)).nth(1)).to_have_text( + "299.99999" + ) + page.get_by_test_id(EARNED_BY_ME_BUTTON).click() + expect((page.get_by_role(ROW).locator(TOTAL_COL_ID)).nth(1)).to_have_text( + "166.66666" + ) \ No newline at end of file diff --git a/apps/trading/e2e/tests/rewards/test_rewards.py b/apps/trading/e2e/tests/rewards/test_rewards.py deleted file mode 100644 index df49fb13d..000000000 --- a/apps/trading/e2e/tests/rewards/test_rewards.py +++ /dev/null @@ -1,475 +0,0 @@ -import pytest - -import vega_sim.proto.vega as vega_protos -from playwright.sync_api import Page, expect -from conftest import init_vega, init_page, auth_setup, cleanup_container -from fixtures.market import setup_continuous_market, market_exists -from actions.utils import next_epoch, change_keys -from wallet_config import MM_WALLET, PARTY_A, PARTY_B, PARTY_C, PARTY_D -from vega_sim.null_service import VegaServiceNull - -# region Constants -ACTIVITY = "activity" -HOARDER = "hoarder" -COMBO = "combo" - -REWARDS_URL = "/#/rewards" - -# test IDs -COMBINED_MULTIPLIERS = "combined-multipliers" -TOTAL_REWARDS = "total-rewards" -PRICE_TAKING_COL_ID = '[col-id="priceTaking"]' -TOTAL_COL_ID = '[col-id="total"]' -ROW = "row" -STREAK_REWARD_MULTIPLIER_VALUE = "streak-reward-multiplier-value" -HOARDER_REWARD_MULTIPLIER_VALUE = "hoarder-reward-multiplier-value" -HOARDER_BONUS_TOTAL_HOARDED = "hoarder-bonus-total-hoarded" -EARNED_BY_ME_BUTTON = "earned-by-me-button" -TRANSFER_AMOUNT = "transfer-amount" -EPOCH_STREAK = "epoch-streak" - -# endregion - - -@pytest.fixture(scope="module") -def market_ids(): - return { - "vega_activity_tier_0": "default_id", - "vega_hoarder_tier_0": "default_id", - "vega_combo_tier_0": "default_id", - "vega_activity_tier_1": "default_id", - "vega_hoarder_tier_1": "default_id", - "vega_combo_tier_1": "default_id", - } - - -@pytest.fixture(scope="module") -def vega_activity_tier_0(request): - with init_vega(request) as vega_activity_tier_0: - request.addfinalizer(lambda: cleanup_container(vega_activity_tier_0)) # Register the cleanup function - yield vega_activity_tier_0 - - -@pytest.fixture(scope="module") -def vega_hoarder_tier_0(request): - with init_vega(request) as vega_hoarder_tier_0: - request.addfinalizer(lambda: cleanup_container(vega_hoarder_tier_0)) # Register the cleanup function - yield vega_hoarder_tier_0 - - -@pytest.fixture(scope="module") -def vega_combo_tier_0(request): - with init_vega(request) as vega_combo_tier_0: - request.addfinalizer(lambda: cleanup_container(vega_combo_tier_0)) # Register the cleanup function - yield vega_combo_tier_0 - - -@pytest.fixture(scope="module") -def vega_activity_tier_1(request): - with init_vega(request) as vega_activity_tier_1: - request.addfinalizer(lambda: cleanup_container(vega_activity_tier_1)) # Register the cleanup function - yield vega_activity_tier_1 - - -@pytest.fixture(scope="module") -def vega_hoarder_tier_1(request): - with init_vega(request) as vega_hoarder_tier_1: - request.addfinalizer(lambda: cleanup_container(vega_hoarder_tier_1)) # Register the cleanup function - yield vega_hoarder_tier_1 - - -@pytest.fixture(scope="module") -def vega_combo_tier_1(request): - with init_vega(request) as vega_combo_tier_1: - request.addfinalizer(lambda: cleanup_container(vega_combo_tier_1)) # Register the cleanup function - yield vega_combo_tier_1 - - -@pytest.fixture -def auth(vega_instance, page): - return auth_setup(vega_instance, page) - - -@pytest.fixture -def page(vega_instance, browser, request): - with init_page(vega_instance, browser, request) as page_instance: - yield page_instance - - -@pytest.fixture -def vega_instance( - reward_program, - vega_activity_tier_0, - vega_hoarder_tier_0, - vega_combo_tier_0, - vega_activity_tier_1, - vega_hoarder_tier_1, - vega_combo_tier_1, - tier, -): - if reward_program == "activity": - return vega_activity_tier_0 if tier == 1 else vega_activity_tier_1 - elif reward_program == "hoarder": - return vega_hoarder_tier_0 if tier == 1 else vega_hoarder_tier_1 - elif reward_program == "combo": - return vega_combo_tier_0 if tier == 1 else vega_combo_tier_1 - - -def setup_market_with_reward_program(vega: VegaServiceNull, reward_programs, tier): - print(f"Started setup_market_with_{reward_programs}_{tier}") - tDAI_market = setup_continuous_market(vega) - tDAI_asset_id = vega.find_asset_id(symbol="tDAI") - vega.mint(key_name=PARTY_B.name, asset=tDAI_asset_id, amount=100000) - vega.mint(key_name=PARTY_C.name, asset=tDAI_asset_id, amount=100000) - vega.mint(key_name=PARTY_A.name, asset=tDAI_asset_id, amount=100000) - vega.mint(key_name=PARTY_D.name, asset=tDAI_asset_id, amount=100000) - next_epoch(vega=vega) - if ACTIVITY in reward_programs: - vega.update_network_parameter( - proposal_key=MM_WALLET.name, - parameter="rewards.activityStreak.benefitTiers", - new_value=ACTIVITY_STREAKS, - ) - print("update_network_parameter activity done") - next_epoch(vega=vega) - - if HOARDER in reward_programs: - vega.update_network_parameter( - proposal_key=MM_WALLET.name, - parameter="rewards.vesting.benefitTiers", - new_value=VESTING, - ) - next_epoch(vega=vega) - - tDAI_asset_id = vega.find_asset_id(symbol="tDAI") - vega.update_network_parameter( - MM_WALLET.name, parameter="reward.asset", new_value=tDAI_asset_id - ) - - next_epoch(vega=vega) - vega.recurring_transfer( - from_key_name=PARTY_A.name, - from_account_type=vega_protos.vega.ACCOUNT_TYPE_GENERAL, - to_account_type=vega_protos.vega.ACCOUNT_TYPE_REWARD_MAKER_PAID_FEES, - asset=tDAI_asset_id, - reference="reward", - asset_for_metric=tDAI_asset_id, - metric=vega_protos.vega.DISPATCH_METRIC_MAKER_FEES_PAID, - # lock_period= 5, - # TODO test lock period - amount=100, - factor=1.0, - ) - vega.submit_order( - trading_key=PARTY_B.name, - market_id=tDAI_market, - order_type="TYPE_MARKET", - time_in_force="TIME_IN_FORCE_IOC", - side="SIDE_BUY", - volume=1, - ) - vega.submit_order( - trading_key=PARTY_A.name, - market_id=tDAI_market, - order_type="TYPE_MARKET", - time_in_force="TIME_IN_FORCE_IOC", - side="SIDE_BUY", - volume=1, - ) - - vega.wait_for_total_catchup() - if tier == 1: - next_epoch(vega=vega) - vega.submit_order( - trading_key=PARTY_B.name, - market_id=tDAI_market, - order_type="TYPE_LIMIT", - time_in_force="TIME_IN_FORCE_GTC", - side="SIDE_BUY", - price=1, - volume=1, - ) - next_epoch(vega=vega) - vega.submit_order( - trading_key=PARTY_B.name, - market_id=tDAI_market, - order_type="TYPE_MARKET", - time_in_force="TIME_IN_FORCE_IOC", - side="SIDE_BUY", - volume=1, - ) - vega.submit_order( - trading_key=PARTY_D.name, - market_id=tDAI_market, - order_type="TYPE_MARKET", - time_in_force="TIME_IN_FORCE_IOC", - side="SIDE_BUY", - volume=1, - ) - vega.wait_for_total_catchup() - next_epoch(vega=vega) - next_epoch(vega=vega) - if HOARDER in reward_programs: - vega.submit_order( - trading_key=PARTY_B.name, - market_id=tDAI_market, - order_type="TYPE_MARKET", - time_in_force="TIME_IN_FORCE_IOC", - side="SIDE_BUY", - volume=1, - ) - vega.submit_order( - trading_key=PARTY_D.name, - market_id=tDAI_market, - order_type="TYPE_MARKET", - time_in_force="TIME_IN_FORCE_IOC", - side="SIDE_BUY", - volume=1, - ) - vega.wait_for_total_catchup() - next_epoch(vega=vega) - next_epoch(vega=vega) - next_epoch(vega=vega) - return tDAI_market, tDAI_asset_id - - -def set_market_reward_program(vega, reward_program, market_ids, tier): - market_id_key = f"vega_{reward_program}_tier_{tier}" - if reward_program == COMBO: - market_id_key = COMBO - market_id = market_ids.get(market_id_key, "default_id") - - print(f"Checking if market exists: {market_id}") - if not market_exists(vega, market_id): - print( - f"Market doesn't exist for {reward_program} {tier}. Setting up new market." - ) - - reward_programs = [reward_program] - if reward_program == COMBO: - reward_programs = [ACTIVITY, HOARDER] - - market_id, _ = setup_market_with_reward_program(vega, reward_programs, tier) - market_ids[market_id_key] = market_id - - return market_id, market_ids - - -ACTIVITY_STREAKS = """ -{ - "tiers": [ - { - "minimum_activity_streak": 2, - "reward_multiplier": "2.0", - "vesting_multiplier": "1.1" - } - ] -} -""" -VESTING = """ -{ - "tiers": [ - { - "minimum_quantum_balance": "10000000", - "reward_multiplier": "2" - } - ] -} -""" - - -@pytest.mark.parametrize( - "reward_program, tier, total_rewards", - [ - (ACTIVITY, 0, "50.00 tDAI"), - (HOARDER, 0, "50.00 tDAI"), - (COMBO, 0, "50.00 tDAI"), - (ACTIVITY, 1, "116.66666 tDAI"), - (HOARDER, 1, "166.66666 tDAI "), - (COMBO, 1, "183.33333 tDAI"), - ], -) -@pytest.mark.usefixtures("auth", "risk_accepted", "market_ids") -def test_network_reward_pot( - reward_program, - vega_instance: VegaServiceNull, - page: Page, - total_rewards, - tier, - market_ids, -): - print("reward program: " + reward_program, " tier:", tier) - market_id, market_ids = set_market_reward_program( - vega_instance, reward_program, market_ids, tier - ) - page.goto(REWARDS_URL) - - change_keys(page, vega_instance, PARTY_B.name) - expect(page.get_by_test_id(TOTAL_REWARDS)).to_have_text(total_rewards) - - -@pytest.mark.parametrize( - "reward_program, tier, reward_multiplier, streak_multiplier, hoarder_multiplier", - [ - (ACTIVITY, 0, "1x", "1x", "1x"), - (HOARDER, 0, "1x", "1x", "1x"), - (COMBO, 0, "1x", "1x", "1x"), - (ACTIVITY, 1, "2x", "2x", "1x"), - (HOARDER, 1, "2x", "1x", "2x"), - (COMBO, 1, "4x", "2x", "2x"), - ], -) -@pytest.mark.usefixtures("auth", "risk_accepted", "market_ids") -def test_reward_multiplier( - reward_program, - vega_instance: VegaServiceNull, - page: Page, - reward_multiplier, - streak_multiplier, - hoarder_multiplier, - tier, - market_ids, -): - print("reward program: " + reward_program, " tier:", tier) - market_id, market_ids = set_market_reward_program( - vega_instance, reward_program, market_ids, tier - ) - page.goto(REWARDS_URL) - change_keys(page, vega_instance, PARTY_B.name) - expect(page.get_by_test_id(COMBINED_MULTIPLIERS)).to_have_text(reward_multiplier) - expect(page.get_by_test_id(STREAK_REWARD_MULTIPLIER_VALUE)).to_have_text( - streak_multiplier - ) - expect(page.get_by_test_id(HOARDER_REWARD_MULTIPLIER_VALUE)).to_have_text( - hoarder_multiplier - ) - - -@pytest.mark.parametrize( - "reward_program, tier, epoch_streak", - [ - (ACTIVITY, 0, "1"), - (ACTIVITY, 1, "7"), - ], -) -@pytest.mark.usefixtures("auth", "risk_accepted", "market_ids") -def test_activity_streak( - reward_program, - vega_instance: VegaServiceNull, - page: Page, - epoch_streak, - tier, - market_ids, -): - print("reward program: " + reward_program, " tier:", tier) - market_id, market_ids = set_market_reward_program( - vega_instance, reward_program, market_ids, tier - ) - page.goto(REWARDS_URL) - change_keys(page, vega_instance, PARTY_B.name) - if tier == 1: - expect(page.get_by_test_id(EPOCH_STREAK)).to_have_text( - "Active trader: " + epoch_streak + " epochs so far (Tier 1 as of last epoch)" - ) - else: - expect(page.get_by_test_id(EPOCH_STREAK)).to_have_text( - "Active trader: " + epoch_streak + " epochs so far " - ) - - -@pytest.mark.parametrize( - "reward_program, tier, rewards_hoarded", - [ - (HOARDER, 0, "5,000,000"), - (HOARDER, 1, "16,666,666"), - ], -) -@pytest.mark.usefixtures("auth", "risk_accepted", "market_ids") -def test_hoarder_bonus( - reward_program, - vega_instance: VegaServiceNull, - page: Page, - rewards_hoarded, - tier, - market_ids, -): - print("reward program: " + reward_program, " tier:", tier) - market_id, market_ids = set_market_reward_program( - vega_instance, reward_program, market_ids, tier - ) - page.goto(REWARDS_URL) - change_keys(page, vega_instance, PARTY_B.name) - expect(page.get_by_test_id(HOARDER_BONUS_TOTAL_HOARDED)).to_contain_text( - rewards_hoarded - ) - - -@pytest.mark.parametrize( - "reward_program, tier, price_taking, total, earned_by_me", - [ - (ACTIVITY, 0, "100.00100.00%", "100.00", "50.00"), - (HOARDER, 0, "100.00100.00%", "100.00", "50.00"), - (COMBO, 0, "100.00100.00%", "100.00", "50.00"), - (ACTIVITY, 1, "300.00100.00%", "300.00", "116.66666"), - (HOARDER, 1, "299.99999100.00%", "299.99999", "166.66666"), - (COMBO, 1, "299.99999100.00%", "299.99999", "183.33333"), - ], -) -@pytest.mark.usefixtures("auth", "risk_accepted", "market_ids") -def test_reward_history( - reward_program, - vega_instance: VegaServiceNull, - page: Page, - price_taking, - total, - earned_by_me, - tier, - market_ids, -): - print("reward program: " + reward_program, " tier:", tier) - market_id, market_ids = set_market_reward_program( - vega_instance, reward_program, market_ids, tier - ) - page.goto(REWARDS_URL) - change_keys(page, vega_instance, PARTY_B.name) - page.locator('[name="fromEpoch"]').fill("1") - expect((page.get_by_role(ROW).locator(PRICE_TAKING_COL_ID)).nth(1)).to_have_text( - price_taking - ) - expect((page.get_by_role(ROW).locator(TOTAL_COL_ID)).nth(1)).to_have_text(total) - page.get_by_test_id(EARNED_BY_ME_BUTTON).click() - expect((page.get_by_role(ROW).locator(TOTAL_COL_ID)).nth(1)).to_have_text( - earned_by_me - ) - - -@pytest.mark.parametrize( - "reward_program, tier", - [ - (ACTIVITY, 1), - ], -) -@pytest.mark.usefixtures("auth", "risk_accepted", "market_ids") -def test_redeem( - reward_program, vega_instance: VegaServiceNull, page: Page, tier, market_ids -): - print("reward program: " + reward_program, " tier:", tier) - market_id, market_ids = set_market_reward_program( - vega_instance, reward_program, market_ids, tier - ) - page.goto(REWARDS_URL) - change_keys(page, vega_instance, PARTY_B.name) - page.get_by_test_id("redeem-rewards-button").click() - available_to_withdraw = page.get_by_test_id( - "available-to-withdraw-value" - ).text_content() - option_value = page.locator( - '[data-testid="transfer-form"] [name="fromAccount"] option[value^="ACCOUNT_TYPE_VESTED_REWARDS"]' - ).first.get_attribute("value") - - page.select_option( - '[data-testid="transfer-form"] [name="fromAccount"]', option_value - ) - - page.get_by_test_id("use-max-button").first.click() - expect(page.get_by_test_id(TRANSFER_AMOUNT)).to_have_text(available_to_withdraw) diff --git a/apps/trading/e2e/tests/rewards/test_rewards_activity_tier_0.py b/apps/trading/e2e/tests/rewards/test_rewards_activity_tier_0.py index 119672e6f..667244e25 100644 --- a/apps/trading/e2e/tests/rewards/test_rewards_activity_tier_0.py +++ b/apps/trading/e2e/tests/rewards/test_rewards_activity_tier_0.py @@ -1,49 +1,27 @@ import pytest +from rewards_test_ids import * import vega_sim.proto.vega as vega_protos from playwright.sync_api import Page, expect -from conftest import init_vega, init_page, auth_setup, risk_accepted_setup, cleanup_container +from conftest import ( + init_vega, + init_page, + auth_setup, + risk_accepted_setup, + cleanup_container, +) from fixtures.market import setup_continuous_market -from actions.utils import next_epoch, change_keys, create_and_faucet_wallet -from wallet_config import MM_WALLET, WalletConfig +from actions.utils import next_epoch, change_keys +from wallet_config import MM_WALLET from vega_sim.null_service import VegaServiceNull -# region Constants -ACTIVITY = "activity" -HOARDER = "hoarder" -COMBO = "combo" - -REWARDS_URL = "/#/rewards" - -# test IDs -COMBINED_MULTIPLIERS = "combined-multipliers" -TOTAL_REWARDS = "total-rewards" -PRICE_TAKING_COL_ID = '[col-id="priceTaking"]' -TOTAL_COL_ID = '[col-id="total"]' -ROW = "row" -STREAK_REWARD_MULTIPLIER_VALUE = "streak-reward-multiplier-value" -HOARDER_REWARD_MULTIPLIER_VALUE = "hoarder-reward-multiplier-value" -HOARDER_BONUS_TOTAL_HOARDED = "hoarder-bonus-total-hoarded" -EARNED_BY_ME_BUTTON = "earned-by-me-button" -TRANSFER_AMOUNT = "transfer-amount" -EPOCH_STREAK = "epoch-streak" - -# endregion - -# Keys -PARTY_A = "PARTY_A" -PARTY_B = "PARTY_B" -PARTY_C = "PARTY_C" -PARTY_D = "PARTY_D" - @pytest.fixture(scope="module") def vega(request): with init_vega(request) as vega_instance: - request.addfinalizer(lambda: cleanup_container(vega_instance)) # Register the cleanup function + request.addfinalizer(lambda: cleanup_container(vega_instance)) yield vega_instance - @pytest.fixture(scope="module") def page(vega, browser, request): with init_page(vega, browser, request) as page: @@ -106,55 +84,31 @@ def setup_market_with_reward_program(vega: VegaServiceNull): side="SIDE_BUY", volume=1, ) - + vega.wait_fn(1) vega.wait_for_total_catchup() - next_epoch(vega=vega) return tDAI_market, tDAI_asset_id -ACTIVITY_STREAKS = """ -{ - "tiers": [ - { - "minimum_activity_streak": 2, - "reward_multiplier": "2.0", - "vesting_multiplier": "1.1" - } - ] -} -""" - - -def keys(vega): - PARTY_A = WalletConfig("PARTY_A", "PARTY_A") - create_and_faucet_wallet(vega=vega, wallet=PARTY_A) - PARTY_B = WalletConfig("PARTY_B", "PARTY_B") - create_and_faucet_wallet(vega=vega, wallet=PARTY_B) - PARTY_C = WalletConfig("PARTY_C", "PARTY_C") - create_and_faucet_wallet(vega=vega, wallet=PARTY_C) - PARTY_D = WalletConfig("PARTY_D", "PARTY_D") - create_and_faucet_wallet(vega=vega, wallet=PARTY_D) - return PARTY_A, PARTY_B, PARTY_C, PARTY_D - - @pytest.mark.xdist_group(name="test_rewards_activity_tier_0") def test_network_reward_pot( page: Page, ): expect(page.get_by_test_id(TOTAL_REWARDS)).to_have_text("50.00 tDAI") + page.pause() @pytest.mark.xdist_group(name="test_rewards_activity_tier_0") def test_reward_multiplier( page: Page, ): + page.pause() expect(page.get_by_test_id(COMBINED_MULTIPLIERS)).to_have_text("1x") expect(page.get_by_test_id(STREAK_REWARD_MULTIPLIER_VALUE)).to_have_text("1x") expect(page.get_by_test_id(HOARDER_REWARD_MULTIPLIER_VALUE)).to_have_text("1x") -@pytest.mark.xdist_group(name="test_rewards_activity_tier_0") +""" @pytest.mark.xdist_group(name="test_rewards_activity_tier_0") def test_activity_streak( page: Page, ): @@ -174,3 +128,4 @@ def test_reward_history( expect((page.get_by_role(ROW).locator(TOTAL_COL_ID)).nth(1)).to_have_text("100.00") page.get_by_test_id(EARNED_BY_ME_BUTTON).click() expect((page.get_by_role(ROW).locator(TOTAL_COL_ID)).nth(1)).to_have_text("50.00") + """ \ No newline at end of file diff --git a/apps/trading/e2e/tests/rewards/test_rewards_activity_tier_1.py b/apps/trading/e2e/tests/rewards/test_rewards_activity_tier_1.py new file mode 100644 index 000000000..80467326e --- /dev/null +++ b/apps/trading/e2e/tests/rewards/test_rewards_activity_tier_1.py @@ -0,0 +1,187 @@ +import pytest +from rewards_test_ids import * +import vega_sim.proto.vega as vega_protos +from playwright.sync_api import Page, expect +from conftest import init_vega, init_page, auth_setup, risk_accepted_setup, cleanup_container +from fixtures.market import setup_continuous_market +from actions.utils import next_epoch, change_keys +from wallet_config import MM_WALLET +from vega_sim.null_service import VegaServiceNull + + +@pytest.fixture(scope="module") +def vega(request): + with init_vega(request) as vega_instance: + request.addfinalizer(lambda: cleanup_container(vega_instance)) + yield vega_instance + + +@pytest.fixture(scope="module") +def page(vega, browser, request): + with init_page(vega, browser, request) as page: + risk_accepted_setup(page) + auth_setup(vega, page) + page.goto(REWARDS_URL) + change_keys(page, vega, PARTY_B) + yield page + +@pytest.fixture(scope="module", autouse=True) +def setup_market_with_reward_program(vega: VegaServiceNull): + tDAI_market = setup_continuous_market(vega) + PARTY_A, PARTY_B, PARTY_C, PARTY_D = keys(vega) + tDAI_asset_id = vega.find_asset_id(symbol="tDAI") + vega.mint(key_name=PARTY_B.name, asset=tDAI_asset_id, amount=100000) + vega.mint(key_name=PARTY_C.name, asset=tDAI_asset_id, amount=100000) + vega.mint(key_name=PARTY_A.name, asset=tDAI_asset_id, amount=100000) + vega.mint(key_name=PARTY_D.name, asset=tDAI_asset_id, amount=100000) + next_epoch(vega=vega) + vega.update_network_parameter( + proposal_key=MM_WALLET.name, + parameter="rewards.activityStreak.benefitTiers", + new_value=ACTIVITY_STREAKS, + ) + print("update_network_parameter activity done") + next_epoch(vega=vega) + + tDAI_asset_id = vega.find_asset_id(symbol="tDAI") + vega.update_network_parameter( + MM_WALLET.name, parameter="reward.asset", new_value=tDAI_asset_id + ) + + next_epoch(vega=vega) + vega.recurring_transfer( + from_key_name=PARTY_A.name, + from_account_type=vega_protos.vega.ACCOUNT_TYPE_GENERAL, + to_account_type=vega_protos.vega.ACCOUNT_TYPE_REWARD_MAKER_PAID_FEES, + asset=tDAI_asset_id, + reference="reward", + asset_for_metric=tDAI_asset_id, + metric=vega_protos.vega.DISPATCH_METRIC_MAKER_FEES_PAID, + # lock_period= 5, + # TODO test lock period + amount=100, + factor=1.0, + ) + vega.submit_order( + trading_key=PARTY_B.name, + market_id=tDAI_market, + order_type="TYPE_MARKET", + time_in_force="TIME_IN_FORCE_IOC", + side="SIDE_BUY", + volume=1, + ) + vega.submit_order( + trading_key=PARTY_A.name, + market_id=tDAI_market, + order_type="TYPE_MARKET", + time_in_force="TIME_IN_FORCE_IOC", + side="SIDE_BUY", + volume=1, + ) + vega.wait_fn(1) + vega.wait_for_total_catchup() + + next_epoch(vega=vega) + vega.submit_order( + trading_key=PARTY_B.name, + market_id=tDAI_market, + order_type="TYPE_LIMIT", + time_in_force="TIME_IN_FORCE_GTC", + side="SIDE_BUY", + price=1, + volume=1, + ) + next_epoch(vega=vega) + vega.submit_order( + trading_key=PARTY_B.name, + market_id=tDAI_market, + order_type="TYPE_MARKET", + time_in_force="TIME_IN_FORCE_IOC", + side="SIDE_BUY", + volume=1, + ) + vega.submit_order( + trading_key=PARTY_D.name, + market_id=tDAI_market, + order_type="TYPE_MARKET", + time_in_force="TIME_IN_FORCE_IOC", + side="SIDE_BUY", + volume=1, + ) + vega.wait_fn(1) + vega.wait_for_total_catchup() + next_epoch(vega=vega) + next_epoch(vega=vega) + vega.submit_order( + trading_key=PARTY_D.name, + market_id=tDAI_market, + order_type="TYPE_MARKET", + time_in_force="TIME_IN_FORCE_IOC", + side="SIDE_BUY", + volume=1, + ) + vega.wait_fn(1) + vega.wait_for_total_catchup() + next_epoch(vega=vega) + next_epoch(vega=vega) + next_epoch(vega=vega) + return tDAI_market, tDAI_asset_id + + +@pytest.mark.xdist_group(name="test_rewards_activity_tier_1") +def test_network_reward_pot(page: Page): + + expect(page.get_by_test_id(TOTAL_REWARDS)).to_have_text("116.66666 tDAI") + + +@pytest.mark.xdist_group(name="test_rewards_activity_tier_1") +def test_reward_multiplier( + page: Page, +): + expect(page.get_by_test_id(COMBINED_MULTIPLIERS)).to_have_text("2x") + expect(page.get_by_test_id(STREAK_REWARD_MULTIPLIER_VALUE)).to_have_text("2x") + expect(page.get_by_test_id(HOARDER_REWARD_MULTIPLIER_VALUE)).to_have_text("1x") + + +@pytest.mark.xdist_group(name="test_rewards_activity_tier_1") +def test_activity_streak( + page: Page, +): + expect(page.get_by_test_id(EPOCH_STREAK)).to_have_text( + "Active trader: 7 epochs so far (Tier 1 as of last epoch)" + ) + + +@pytest.mark.xdist_group(name="test_rewards_activity_tier_1") +def test_reward_history( + page: Page, +): + page.locator('[name="fromEpoch"]').fill("1") + expect((page.get_by_role(ROW).locator(PRICE_TAKING_COL_ID)).nth(1)).to_have_text( + "300.00100.00%" + ) + expect((page.get_by_role(ROW).locator(TOTAL_COL_ID)).nth(1)).to_have_text("300.00") + page.get_by_test_id(EARNED_BY_ME_BUTTON).click() + expect((page.get_by_role(ROW).locator(TOTAL_COL_ID)).nth(1)).to_have_text( + "116.66666" + ) + + +@pytest.mark.xdist_group(name="test_rewards_activity_tier_1") +def test_redeem( + page: Page, +): + page.get_by_test_id("redeem-rewards-button").click() + available_to_withdraw = page.get_by_test_id( + "available-to-withdraw-value" + ).text_content() + option_value = page.locator( + '[data-testid="transfer-form"] [name="fromAccount"] option[value^="ACCOUNT_TYPE_VESTED_REWARDS"]' + ).first.get_attribute("value") + + page.select_option( + '[data-testid="transfer-form"] [name="fromAccount"]', option_value + ) + + page.get_by_test_id("use-max-button").first.click() + expect(page.get_by_test_id(TRANSFER_AMOUNT)).to_have_text(available_to_withdraw) \ No newline at end of file diff --git a/apps/trading/e2e/tests/rewards/test_rewards_combo_tier_1.py b/apps/trading/e2e/tests/rewards/test_rewards_combo_tier_1.py new file mode 100644 index 000000000..a2263dcc9 --- /dev/null +++ b/apps/trading/e2e/tests/rewards/test_rewards_combo_tier_1.py @@ -0,0 +1,174 @@ +import pytest +from rewards_test_ids import * +import vega_sim.proto.vega as vega_protos +from playwright.sync_api import Page, expect +from conftest import init_vega, init_page, auth_setup, risk_accepted_setup, cleanup_container +from fixtures.market import setup_continuous_market +from actions.utils import next_epoch, change_keys +from wallet_config import MM_WALLET +from vega_sim.null_service import VegaServiceNull + +@pytest.fixture(scope="module") +def vega(request): + with init_vega(request) as vega_instance: + request.addfinalizer(lambda: cleanup_container(vega_instance)) + yield vega_instance + + + +@pytest.fixture(scope="module") +def page(vega, browser, request): + with init_page(vega, browser, request) as page: + risk_accepted_setup(page) + auth_setup(vega, page) + page.goto(REWARDS_URL) + change_keys(page, vega, PARTY_B) + yield page + + +@pytest.fixture(scope="module", autouse=True) +def setup_market_with_reward_program(vega: VegaServiceNull): + tDAI_market = setup_continuous_market(vega) + PARTY_A, PARTY_B, PARTY_C, PARTY_D = keys(vega) + tDAI_asset_id = vega.find_asset_id(symbol="tDAI") + vega.mint(key_name=PARTY_B.name, asset=tDAI_asset_id, amount=100000) + vega.mint(key_name=PARTY_C.name, asset=tDAI_asset_id, amount=100000) + vega.mint(key_name=PARTY_A.name, asset=tDAI_asset_id, amount=100000) + vega.mint(key_name=PARTY_D.name, asset=tDAI_asset_id, amount=100000) + next_epoch(vega=vega) + vega.update_network_parameter( + proposal_key=MM_WALLET.name, + parameter="rewards.activityStreak.benefitTiers", + new_value=ACTIVITY_STREAKS, + ) + print("update_network_parameter activity done") + next_epoch(vega=vega) + + vega.update_network_parameter( + proposal_key=MM_WALLET.name, + parameter="rewards.vesting.benefitTiers", + new_value=VESTING, + ) + next_epoch(vega=vega) + + tDAI_asset_id = vega.find_asset_id(symbol="tDAI") + vega.update_network_parameter( + MM_WALLET.name, parameter="reward.asset", new_value=tDAI_asset_id + ) + + next_epoch(vega=vega) + vega.recurring_transfer( + from_key_name=PARTY_A.name, + from_account_type=vega_protos.vega.ACCOUNT_TYPE_GENERAL, + to_account_type=vega_protos.vega.ACCOUNT_TYPE_REWARD_MAKER_PAID_FEES, + asset=tDAI_asset_id, + reference="reward", + asset_for_metric=tDAI_asset_id, + metric=vega_protos.vega.DISPATCH_METRIC_MAKER_FEES_PAID, + amount=100, + factor=1.0, + ) + vega.submit_order( + trading_key=PARTY_B.name, + market_id=tDAI_market, + order_type="TYPE_MARKET", + time_in_force="TIME_IN_FORCE_IOC", + side="SIDE_BUY", + volume=1, + ) + vega.submit_order( + trading_key=PARTY_A.name, + market_id=tDAI_market, + order_type="TYPE_MARKET", + time_in_force="TIME_IN_FORCE_IOC", + side="SIDE_BUY", + volume=1, + ) + vega.wait_fn(1) + vega.wait_for_total_catchup() + next_epoch(vega=vega) + vega.submit_order( + trading_key=PARTY_B.name, + market_id=tDAI_market, + order_type="TYPE_LIMIT", + time_in_force="TIME_IN_FORCE_GTC", + side="SIDE_BUY", + price=1, + volume=1, + ) + next_epoch(vega=vega) + vega.submit_order( + trading_key=PARTY_B.name, + market_id=tDAI_market, + order_type="TYPE_MARKET", + time_in_force="TIME_IN_FORCE_IOC", + side="SIDE_BUY", + volume=1, + ) + vega.submit_order( + trading_key=PARTY_D.name, + market_id=tDAI_market, + order_type="TYPE_MARKET", + time_in_force="TIME_IN_FORCE_IOC", + side="SIDE_BUY", + volume=1, + ) + vega.wait_fn(1) + vega.wait_for_total_catchup() + next_epoch(vega=vega) + next_epoch(vega=vega) + vega.submit_order( + trading_key=PARTY_B.name, + market_id=tDAI_market, + order_type="TYPE_MARKET", + time_in_force="TIME_IN_FORCE_IOC", + side="SIDE_BUY", + volume=1, + ) + vega.submit_order( + trading_key=PARTY_D.name, + market_id=tDAI_market, + order_type="TYPE_MARKET", + time_in_force="TIME_IN_FORCE_IOC", + side="SIDE_BUY", + volume=1, + ) + vega.wait_for_total_catchup() + next_epoch(vega=vega) + next_epoch(vega=vega) + next_epoch(vega=vega) + return tDAI_market, tDAI_asset_id + + +@pytest.mark.xdist_group(name="test_rewards_combo_tier_1") +def test_network_reward_pot( page: Page +): + expect(page.get_by_test_id(TOTAL_REWARDS)).to_have_text("183.33333 tDAI") + + +@pytest.mark.xdist_group(name="test_rewards_combo_tier_1") +def test_reward_multiplier( + page: Page, +): + expect(page.get_by_test_id(COMBINED_MULTIPLIERS)).to_have_text("4x") + expect(page.get_by_test_id(STREAK_REWARD_MULTIPLIER_VALUE)).to_have_text( + "2x" + ) + expect(page.get_by_test_id(HOARDER_REWARD_MULTIPLIER_VALUE)).to_have_text( + "2x" + ) + + +@pytest.mark.xdist_group(name="test_rewards_combo_tier_1") +def test_reward_history( + page: Page, +): + page.locator('[name="fromEpoch"]').fill("1") + expect((page.get_by_role(ROW).locator(PRICE_TAKING_COL_ID)).nth(1)).to_have_text( + "299.99999100.00%" + ) + expect((page.get_by_role(ROW).locator(TOTAL_COL_ID)).nth(1)).to_have_text("299.99999") + page.get_by_test_id(EARNED_BY_ME_BUTTON).click() + expect((page.get_by_role(ROW).locator(TOTAL_COL_ID)).nth(1)).to_have_text( + "183.33333" + ) \ No newline at end of file diff --git a/apps/trading/e2e/tests/rewards/test_vesting.py b/apps/trading/e2e/tests/rewards/test_vesting.py index 80175202f..0b74cd913 100644 --- a/apps/trading/e2e/tests/rewards/test_vesting.py +++ b/apps/trading/e2e/tests/rewards/test_vesting.py @@ -43,6 +43,7 @@ def test_vesting(continuous_market, vega: VegaServiceNull, page: Page): side="SIDE_BUY", volume=1, ) + vega.wait_fn(1) vega.wait_for_total_catchup() page.goto("/#/rewards") diff --git a/apps/trading/e2e/tests/settings/test_settings.py b/apps/trading/e2e/tests/settings/test_settings.py index ea052bc40..aa0d3f609 100644 --- a/apps/trading/e2e/tests/settings/test_settings.py +++ b/apps/trading/e2e/tests/settings/test_settings.py @@ -6,7 +6,7 @@ from conftest import init_vega, cleanup_container @pytest.fixture(scope="module") def vega(request): with init_vega(request) as vega_instance: - request.addfinalizer(lambda: cleanup_container(vega_instance)) # Register the cleanup function + request.addfinalizer(lambda: cleanup_container(vega_instance)) yield vega_instance diff --git a/apps/trading/e2e/tests/teams/test_teams.py b/apps/trading/e2e/tests/teams/test_teams.py index 56882395d..3467bd908 100644 --- a/apps/trading/e2e/tests/teams/test_teams.py +++ b/apps/trading/e2e/tests/teams/test_teams.py @@ -14,7 +14,7 @@ def vega(request): with init_vega(request) as vega_instance: request.addfinalizer( lambda: cleanup_container(vega_instance) - ) # Register the cleanup function + ) yield vega_instance