diff --git a/apps/governance-e2e/.env b/apps/governance-e2e/.env index fa5f7d475..169071218 100644 --- a/apps/governance-e2e/.env +++ b/apps/governance-e2e/.env @@ -22,6 +22,7 @@ NX_WALLETCONNECT_PROJECT_ID=fe8091dc35738863e509fc4947525c72 NX_VEGA_REST_URL=http://localhost:3008/api/v2/ NX_SUCCESSOR_MARKETS=true NX_PRODUCT_PERPETUALS=true +NX_UPDATE_MARKET_STATE=true NX_VEGA_EXPLORER_URL=https://explorer.fairground.wtf NX_CHROME_EXTENSION_URL=https://chrome.google.com/webstore/detail/vega-wallet-fairground/nmmjkiafpmphlikhefgjbblebfgclikn diff --git a/apps/governance-e2e/src/fixtures/proposals/asset.json b/apps/governance-e2e/src/fixtures/proposals/asset.json deleted file mode 100644 index 6ea2d69b3..000000000 --- a/apps/governance-e2e/src/fixtures/proposals/asset.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "rationale": { - "title": "Add USDT Coin (USDT)", - "description": "Proposal to add USDT Coin (USDT) as an asset" - }, - "terms": { - "newAsset": { - "changes": { - "name": "USDT Coin", - "symbol": "USDT", - "decimals": "18", - "quantum": "1", - "erc20": { - "contractAddress": "0xb404c51bbc10dcbe948077f18a4b8e553d160084" - } - } - }, - "closingTimestamp": 1662374250, - "enactmentTimestamp": 1662460650 - } -} diff --git a/apps/governance-e2e/src/fixtures/proposals/resume-market-raw.json b/apps/governance-e2e/src/fixtures/proposals/resume-market-raw.json new file mode 100644 index 000000000..c9a103eb7 --- /dev/null +++ b/apps/governance-e2e/src/fixtures/proposals/resume-market-raw.json @@ -0,0 +1,16 @@ +{ + "rationale": { + "title": "Market resume test", + "description": "E2E test for market resume proposal" + }, + "terms": { + "updateMarketState": { + "changes": { + "marketId": "b33bb4157e12355db22e41f277ddd0c10104dec29a4d6960bbcb96d186c40cbd", + "updateType": "MARKET_STATE_UPDATE_TYPE_RESUME" + } + }, + "closingTimestamp": 0, + "enactmentTimestamp": 0 + } +} diff --git a/apps/governance-e2e/src/fixtures/proposals/suspend-market-raw.json b/apps/governance-e2e/src/fixtures/proposals/suspend-market-raw.json new file mode 100644 index 000000000..91f74eef1 --- /dev/null +++ b/apps/governance-e2e/src/fixtures/proposals/suspend-market-raw.json @@ -0,0 +1,16 @@ +{ + "rationale": { + "title": "Market suspended test", + "description": "E2E test for market suspended proposal" + }, + "terms": { + "updateMarketState": { + "changes": { + "marketId": "", + "updateType": "MARKET_STATE_UPDATE_TYPE_SUSPEND" + } + }, + "closingTimestamp": 0, + "enactmentTimestamp": 0 + } +} diff --git a/apps/governance-e2e/src/fixtures/proposals/terminate-market-raw.json b/apps/governance-e2e/src/fixtures/proposals/terminate-market-raw.json new file mode 100644 index 000000000..c08abc4b8 --- /dev/null +++ b/apps/governance-e2e/src/fixtures/proposals/terminate-market-raw.json @@ -0,0 +1,17 @@ +{ + "rationale": { + "title": "Market terminate test", + "description": "E2E test for market terminate proposal" + }, + "terms": { + "updateMarketState": { + "changes": { + "marketId": "", + "updateType": "MARKET_STATE_UPDATE_TYPE_TERMINATE", + "price": "100" + } + }, + "closingTimestamp": 0, + "enactmentTimestamp": 0 + } +} diff --git a/apps/governance-e2e/src/fixtures/proposals/update-market-old.json b/apps/governance-e2e/src/fixtures/proposals/update-market-old.json deleted file mode 100644 index 7b3c214f6..000000000 --- a/apps/governance-e2e/src/fixtures/proposals/update-market-old.json +++ /dev/null @@ -1,85 +0,0 @@ -{ - "instrument": { - "code": "Token.24h", - "future": { - "quoteName": "fBTC", - "dataSourceSpecForSettlementData": { - "external": { - "oracle": { - "signers": [ - { - "pubKey": { - "key": "70d14a321e02e71992fd115563df765000ccc4775cbe71a0e2f9ff5a3b9dc680" - } - } - ], - "filters": [ - { - "key": { - "name": "prices.BTC.value", - "type": "TYPE_INTEGER" - }, - "conditions": [ - { - "operator": "OPERATOR_GREATER_THAN", - "value": "0" - } - ] - } - ] - } - } - }, - "dataSourceSpecForTradingTermination": { - "external": { - "oracle": { - "signers": [ - { - "pubKey": { - "key": "70d14a321e02e71992fd115563df765000ccc4775cbe71a0e2f9ff5a3b9dc680" - } - } - ], - "filters": [ - { - "key": { - "name": "trading.terminated.ETH5", - "type": "TYPE_BOOLEAN" - }, - "conditions": [ - { - "operator": "OPERATOR_GREATER_THAN_OR_EQUAL", - "value": "1648684800000000000" - } - ] - } - ] - } - } - }, - "dataSourceSpecBinding": { - "settlementDataProperty": "prices.BTC.value", - "tradingTerminationProperty": "trading.terminated.ETH5" - } - } - }, - "metadata": ["sector:energy", "sector:food", "source:docs.vega.xyz"], - "priceMonitoringParameters": { - "triggers": [ - { - "horizon": "43200", - "probability": "0.9999999", - "auctionExtension": "600" - } - ] - }, - "logNormal": { - "tau": 0.0001140771161, - "riskAversionParameter": 0.001, - "params": { - "mu": 0, - "r": 0.016, - "sigma": 0.3 - } - } -} diff --git a/apps/governance-e2e/src/integration/flow/proposal-details.cy.ts b/apps/governance-e2e/src/integration/flow/proposal-details.cy.ts index f9f3aee7c..0bc586370 100644 --- a/apps/governance-e2e/src/integration/flow/proposal-details.cy.ts +++ b/apps/governance-e2e/src/integration/flow/proposal-details.cy.ts @@ -60,6 +60,17 @@ describe( before('connect wallets and set approval limit', function () { cy.visit('/'); ethereumWalletConnect(); + cy.createMarket(); + navigateTo(navigation.proposals); + cy.getByTestId('closed-proposals').within(() => { + cy.contains('Add Lorem Ipsum market') + .parentsUntil(proposalListItem) + .last() + .within(() => { + cy.getByTestId(viewProposalButton).click(); + }); + }); + getProposalInformationFromTable('ID').invoke('text').as('parentMarketId'); }); beforeEach('visit proposals tab', function () { @@ -298,9 +309,6 @@ describe( }); it('Able to see successor market details with new and updated values', function () { - cy.createMarket(); - cy.reload(); - waitForSpinner(); cy.getByTestId('closed-proposals').within(() => { cy.contains('Add Lorem Ipsum market') .parentsUntil(proposalListItem) @@ -309,14 +317,9 @@ describe( cy.getByTestId(viewProposalButton).click(); }); }); - getProposalInformationFromTable('ID') - .invoke('text') - .as('parentMarketId') - .then(() => { - cy.VegaWalletSubmitProposal( - createSuccessorMarketProposalTxBody(this.parentMarketId) - ); - }); + cy.VegaWalletSubmitProposal( + createSuccessorMarketProposalTxBody(this.parentMarketId) + ); navigateTo(navigation.proposals); cy.reload(); getProposalFromTitle('Test successor market proposal details').within( @@ -434,5 +437,87 @@ describe( 'Minimum Probability Of Trading LP Orders' ).should('contain.text', '1e-8'); }); + + it('Able to see suspended market proposal', function () { + const proposalPath = 'src/fixtures/proposals/suspend-market-raw.json'; + const enactmentTimestamp = createTenDigitUnixTimeStampForSpecifiedDays(3); + const closingTimestamp = createTenDigitUnixTimeStampForSpecifiedDays(2); + submitUniqueRawProposal({ + proposalBody: proposalPath, + updateMarketId: this.parentMarketId, + enactmentTimestamp: enactmentTimestamp, + closingTimestamp: closingTimestamp, + }); + getProposalFromTitle('Market suspended test').within(() => { + cy.getByTestId(marketProposalType).should( + 'have.text', + 'Suspend market' + ); + cy.getByTestId(viewProposalButton).click(); + }); + cy.getByTestId(marketProposalType).should('have.text', 'Suspend market'); + cy.getByTestId(marketDataToggle).click(); + cy.getByTestId('proposal-update-market-state').within(() => { + getProposalInformationFromTable('Market ID') + .invoke('text') + .and('eq', this.parentMarketId); + }); + }); + + it('Able to see resume market proposal', function () { + const proposalPath = 'src/fixtures/proposals/resume-market-raw.json'; + const enactmentTimestamp = createTenDigitUnixTimeStampForSpecifiedDays(3); + const closingTimestamp = createTenDigitUnixTimeStampForSpecifiedDays(2); + submitUniqueRawProposal({ + proposalBody: proposalPath, + updateMarketId: this.parentMarketId, + enactmentTimestamp: enactmentTimestamp, + closingTimestamp: closingTimestamp, + }); + getProposalFromTitle('Market resume test').within(() => { + cy.getByTestId(marketProposalType).should('have.text', 'Resume market'); + cy.getByTestId(viewProposalButton).click(); + }); + cy.getByTestId(marketProposalType).should('have.text', 'Resume market'); + cy.getByTestId(marketDataToggle).click(); + cy.getByTestId('proposal-update-market-state').within(() => { + getProposalInformationFromTable('Market ID') + .invoke('text') + .and('eq', this.parentMarketId); + }); + }); + + it('Able to see terminate market proposal', function () { + const proposalPath = 'src/fixtures/proposals/terminate-market-raw.json'; + const enactmentTimestamp = createTenDigitUnixTimeStampForSpecifiedDays(3); + const closingTimestamp = createTenDigitUnixTimeStampForSpecifiedDays(2); + submitUniqueRawProposal({ + proposalBody: proposalPath, + updateMarketId: this.parentMarketId, + enactmentTimestamp: enactmentTimestamp, + closingTimestamp: closingTimestamp, + }); + getProposalFromTitle('Market terminate test').within(() => { + cy.getByTestId(marketProposalType).should( + 'have.text', + 'Terminate market' + ); + cy.getByTestId(viewProposalButton).click(); + }); + cy.getByTestId(marketProposalType).should( + 'have.text', + 'Terminate market' + ); + cy.getByTestId(marketDataToggle).click(); + cy.getByTestId('proposal-update-market-state').within(() => { + getProposalInformationFromTable('Market ID') + .invoke('text') + .and('eq', this.parentMarketId); + getProposalDetailsValue('Termination Price').should( + 'contain.text', + '0.001 fUSDC' + ); + }); + }); } ); diff --git a/apps/governance-e2e/src/support/governance.functions.ts b/apps/governance-e2e/src/support/governance.functions.ts index c908a1509..f86e46afb 100644 --- a/apps/governance-e2e/src/support/governance.functions.ts +++ b/apps/governance-e2e/src/support/governance.functions.ts @@ -54,6 +54,7 @@ export function submitUniqueRawProposal(proposalFields: { proposalBody?: string; proposalTitle?: string; proposalDescription?: string; + updateMarketId?: string; closingTimestamp?: number; enactmentTimestamp?: number; submit?: boolean; @@ -71,6 +72,10 @@ export function submitUniqueRawProposal(proposalFields: { if (proposalFields.proposalDescription) { rawProposal.rationale.description = proposalFields.proposalDescription; } + if (proposalFields.updateMarketId) { + rawProposal.terms.updateMarketState.changes.marketId = + proposalFields.updateMarketId; + } if (proposalFields.closingTimestamp) { rawProposal.terms.closingTimestamp = proposalFields.closingTimestamp; } else if (