test(2704): proposals with market (#2775)

This commit is contained in:
Joe Tsang 2023-01-30 18:06:04 +00:00 committed by GitHub
parent 3ee0eee80d
commit 1861852852
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
13 changed files with 398 additions and 166 deletions

View File

@ -16,4 +16,16 @@ NX_VEGA_DOCS_URL=https://docs.vega.xyz/mainnet
#Test configuration variables #Test configuration variables
CYPRESS_FAIRGROUND=false CYPRESS_FAIRGROUND=false
CYPRESS_VEGA_URL=http://localhost:3028/query CYPRESS_VEGA_URL=http://localhost:3028/query
CYPRESS_VEGA_WALLET_API_TOKEN= CYPRESS_VEGA_WALLET_API_TOKEN=jpeAkxcffzTLCzBX2m5TZIp3hF500YZhHwESwNKOGksdGPXeeIznXypaDfpNe2M9
CYPRESS_ETH_WALLET_MNEMONIC=ozone access unlock valid olympic save include omit supply green clown session
CYPRESS_ETHEREUM_PROVIDER_URL=http://localhost:8545
CYPRESS_EXPLORER_URL=https://explorer.fairground.wtf
CYPRESS_FAUCET_URL=http://localhost:1790/api/v1/mint
CYPRESS_TRUNCATED_VEGA_PUBLIC_KEY=02ecea…342f65
CYPRESS_TRUNCATED_VEGA_PUBLIC_KEY2=7f9cf0…c25535
CYPRESS_VEGA_ENV=CUSTOM
CYPRESS_VEGA_PUBLIC_KEY=02eceaba4df2bef76ea10caf728d8a099a2aa846cced25737cccaa9812342f65
CYPRESS_VEGA_PUBLIC_KEY2=7f9cf07d3a9905b1a61a1069f7a758855da428bc0f4a97de87f48644bfc25535
CYPRESS_VEGA_TOKEN_URL=https://token.fairground.wtf
CYPRESS_VEGA_URL=http://localhost:3028/query
CYPRESS_VEGA_WALLET_URL=http://localhost:1789

View File

@ -2,27 +2,29 @@
"changes": { "changes": {
"decimalPlaces": "5", "decimalPlaces": "5",
"positionDecimalPlaces": "5", "positionDecimalPlaces": "5",
"lpPriceRange": "10",
"instrument": { "instrument": {
"name": "Oranges Daily", "name": "Token test market",
"code": "ORANGES.24h", "code": "Token.24h",
"future": { "future": {
"settlementAsset": "8b52d4a3a4b0ffe733cddbc2b67be273816cfeb6ca4c8b339bac03ffba08e4e4", "settlementAsset": "fBTC",
"quoteName": "tEuro", "quoteName": "fBTC",
"settlementDataDecimals": 5,
"dataSourceSpecForSettlementData": { "dataSourceSpecForSettlementData": {
"external": {
"oracle": {
"signers": [ "signers": [
{ {
"signer": { "pubKey": {
"__typename": "ETHAddress", "key": "70d14a321e02e71992fd115563df765000ccc4775cbe71a0e2f9ff5a3b9dc680"
"address": "0xfCEAdAFab14d46e20144F48824d0C09B1a03F2BC"
} }
} }
], ],
"filters": [ "filters": [
{ {
"key": { "key": {
"name": "prices.BTC.value", "name": "prices.ETH.value",
"type": "TYPE_INTEGER" "type": "TYPE_INTEGER",
"numberDecimalPlaces": "0"
}, },
"conditions": [ "conditions": [
{ {
@ -32,26 +34,27 @@
] ]
} }
] ]
}
}
}, },
"dataSourceSpecForTradingTermination": { "dataSourceSpecForTradingTermination": {
"signers": [ "signers": [
{ {
"signer": { "pubKey": {
"__typename": "ETHAddress", "key": "70d14a321e02e71992fd115563df765000ccc4775cbe71a0e2f9ff5a3b9dc680"
"address": "0xfCEAdAFab14d46e20144F48824d0C09B1a03F2BC"
} }
} }
], ],
"filters": [ "filters": [
{ {
"key": { "key": {
"name": "vegaprotocol.builtin.timestamp", "name": "trading.terminated.ETH5",
"type": "TYPE_TIMESTAMP" "type": "TYPE_BOOLEAN"
}, },
"conditions": [ "conditions": [
{ {
"operator": "OPERATOR_GREATER_THAN_OR_EQUAL", "operator": "OPERATOR_EQUALS",
"value": "1648684800000000000" "value": "true"
} }
] ]
} }
@ -59,7 +62,7 @@
}, },
"dataSourceSpecBinding": { "dataSourceSpecBinding": {
"settlementPriceProperty": "prices.BTC.value", "settlementPriceProperty": "prices.BTC.value",
"tradingTerminationProperty": "vegaprotocol.builtin.timestamp" "tradingTerminationProperty": "trading.terminated.ETH5"
} }
} }
}, },

View File

@ -1,24 +1,21 @@
{ {
"marketId": "315a8e48db0a292c92b617264728048c82c20efc922c75fd292fc54e5c727c81",
"changes": {
"instrument": { "instrument": {
"code": "ORANGES.24h", "code": "TEST.24h",
"future": { "future": {
"quoteName": "tEuro", "quoteName": "fUSDC",
"settlementDataDecimals": 5, "settlementDataDecimals": 5,
"dataSourceSpecForSettlementData": { "dataSourceSpecForSettlementData": {
"signers": [ "signers": [
{ {
"signer": { "pubKey": {
"__typename": "ETHAddress", "key": "70d14a321e02e71992fd115563df765000ccc4775cbe71a0e2f9ff5a3b9dc680"
"address": "0xfCEAdAFab14d46e20144F48824d0C09B1a03F2BC"
} }
} }
], ],
"filters": [ "filters": [
{ {
"key": { "key": {
"name": "prices.BTC.value", "name": "prices.ETH.value",
"type": "TYPE_INTEGER" "type": "TYPE_INTEGER"
}, },
"conditions": [ "conditions": [
@ -33,17 +30,16 @@
"dataSourceSpecForTradingTermination": { "dataSourceSpecForTradingTermination": {
"signers": [ "signers": [
{ {
"signer": { "pubKey": {
"__typename": "ETHAddress", "key": "70d14a321e02e71992fd115563df765000ccc4775cbe71a0e2f9ff5a3b9dc680"
"address": "0xfCEAdAFab14d46e20144F48824d0C09B1a03F2BC"
} }
} }
], ],
"filters": [ "filters": [
{ {
"key": { "key": {
"name": "vegaprotocol.builtin.timestamp", "name": "trading.terminated.ETH5",
"type": "TYPE_TIMESTAMP" "type": "TYPE_BOOLEAN"
}, },
"conditions": [ "conditions": [
{ {
@ -55,8 +51,8 @@
] ]
}, },
"dataSourceSpecBinding": { "dataSourceSpecBinding": {
"settlementPriceProperty": "prices.BTC.value", "settlementPriceProperty": "prices.ETH.value",
"tradingTerminationProperty": "vegaprotocol.builtin.timestamp" "tradingTerminationProperty": "trading.terminated.ETH5"
} }
} }
}, },
@ -79,5 +75,4 @@
"sigma": 0.3 "sigma": 0.3
} }
} }
}
} }

View File

@ -1 +1 @@
123 0123245

View File

@ -11,6 +11,7 @@ const newProposalSubmitButton = '[data-testid="proposal-submit"]';
const dialogCloseButton = '[data-testid="dialog-close"]'; const dialogCloseButton = '[data-testid="dialog-close"]';
const viewProposalButton = '[data-testid="view-proposal-btn"]'; const viewProposalButton = '[data-testid="view-proposal-btn"]';
const openProposals = '[data-testid="open-proposals"]'; const openProposals = '[data-testid="open-proposals"]';
const closedProposals = '[data-testid="closed-proposals"]';
const proposalVoteProgressForPercentage = const proposalVoteProgressForPercentage =
'[data-testid="vote-progress-indicator-percentage-for"]'; '[data-testid="vote-progress-indicator-percentage-for"]';
const proposalVoteProgressAgainstPercentage = const proposalVoteProgressAgainstPercentage =
@ -22,7 +23,9 @@ const proposalVoteProgressAgainstTokens =
const changeVoteButton = '[data-testid="change-vote-button"]'; const changeVoteButton = '[data-testid="change-vote-button"]';
const proposalDetailsTitle = '[data-testid="proposal-title"]'; const proposalDetailsTitle = '[data-testid="proposal-title"]';
const proposalDetailsDescription = '[data-testid="proposal-description"]'; const proposalDetailsDescription = '[data-testid="proposal-description"]';
const proposalStatus = '[data-testid="proposal-status"]';
const rawProposalData = '[data-testid="proposal-data"]'; const rawProposalData = '[data-testid="proposal-data"]';
const votesTable = '[data-testid="votes-table"]';
const minVoteButton = '[data-testid="min-vote"]'; const minVoteButton = '[data-testid="min-vote"]';
const maxVoteButton = '[data-testid="max-vote"]'; const maxVoteButton = '[data-testid="max-vote"]';
const voteButtons = '[data-testid="vote-buttons"]'; const voteButtons = '[data-testid="vote-buttons"]';
@ -37,6 +40,10 @@ const txTimeout = Cypress.env('txTimeout');
const epochTimeout = Cypress.env('epochTimeout'); const epochTimeout = Cypress.env('epochTimeout');
const proposalTimeout = { timeout: 14000 }; const proposalTimeout = { timeout: 14000 };
const minCloseDays = 2;
const maxCloseDays = 3;
const requiredParticipation = 0.001;
const governanceProposalType = { const governanceProposalType = {
NETWORK_PARAMETER: 'Network parameter', NETWORK_PARAMETER: 'Network parameter',
NEW_MARKET: 'New market', NEW_MARKET: 'New market',
@ -65,21 +72,6 @@ context(
network_parameters['governance.proposal.freeform.requiredMajority'] * network_parameters['governance.proposal.freeform.requiredMajority'] *
100 100
).as('requiredMajority'); ).as('requiredMajority');
cy.wrap(
network_parameters[
'governance.proposal.freeform.requiredParticipation'
] * 100
).as('requiredParticipation');
cy.wrap(
network_parameters['governance.proposal.freeform.minClose'].split(
'h'
)[0] / 24
).as('minCloseDays');
cy.wrap(
network_parameters['governance.proposal.freeform.maxClose'].split(
'h'
)[0] / 24
).as('maxCloseDays');
cy.wrap( cy.wrap(
network_parameters['governance.proposal.freeform.minClose'].split( network_parameters['governance.proposal.freeform.minClose'].split(
'h' 'h'
@ -108,21 +100,6 @@ context(
0.00001, 0.00001,
'Asserting that value is at least 0.00001 for network parameter minVoterBalance' 'Asserting that value is at least 0.00001 for network parameter minVoterBalance'
); );
assert.isAtLeast(
parseFloat(this.requiredParticipation),
0.00001,
'Asserting that value is at least 0.00001 for network parameter requiredParticipation'
);
assert.isAtLeast(
parseInt(this.minCloseDays),
1,
'Asserting that value is at least 1 for network parameter minCloseDays'
);
assert.isAtLeast(
parseInt(this.maxCloseDays),
parseInt(this.minCloseDays + 1),
'Asserting that network parameter maxCloseDays is at least 1 day higher than minCloseDays'
);
// workaround for first eth tx hanging // workaround for first eth tx hanging
associateTokenStartOfTests(); associateTokenStartOfTests();
} }
@ -182,10 +159,10 @@ context(
this.minProposerBalance this.minProposerBalance
); );
let proposalDays = [ let proposalDays = [
this.minCloseDays + 1, minCloseDays + 1,
this.maxCloseDays, maxCloseDays,
this.minCloseDays + 3, minCloseDays + 3,
this.minCloseDays + 2, minCloseDays + 2,
]; ];
for (var index = 0; index < proposalDays.length; index++) { for (var index = 0; index < proposalDays.length; index++) {
cy.go_to_make_new_proposal(governanceProposalType.RAW); cy.go_to_make_new_proposal(governanceProposalType.RAW);
@ -227,6 +204,7 @@ context(
cy.navigate_to('validators'); cy.navigate_to('validators');
cy.click_on_validator_from_list(0); cy.click_on_validator_from_list(0);
cy.staking_validator_page_add_stake('2'); cy.staking_validator_page_add_stake('2');
cy.close_staking_dialog();
cy.get(vegaWalletStakedBalances, txTimeout).should('contain', '2'); cy.get(vegaWalletStakedBalances, txTimeout).should('contain', '2');
@ -297,10 +275,12 @@ context(
}); });
}); });
// Skipping test due to bug: #1320 // 3001-VOTE-071
it.skip('Newly created freeform proposals list - shows proposal participation - both met and not', function () { it('Newly created freeform proposals list - shows proposal participation - both met and not', function () {
createFreeformProposal(this.minProposerBalance); const proposalTitle = generateProposalTitle();
cy.get_submitted_proposal_from_proposal_list() createFreeformProposal(this.minProposerBalance, proposalTitle);
cy.get_submitted_proposal_from_proposal_list(proposalTitle)
.as('submittedProposal') .as('submittedProposal')
.within(() => { .within(() => {
// 3001-VOTE-039 // 3001-VOTE-039
@ -312,7 +292,7 @@ context(
.invoke('text') .invoke('text')
.then((totalSupply) => { .then((totalSupply) => {
let tokensRequiredToAchieveResult = parseFloat( let tokensRequiredToAchieveResult = parseFloat(
(totalSupply.replace(/,/g, '') * this.requiredParticipation) / 100 (totalSupply.replace(/,/g, '') * requiredParticipation) / 100
).toFixed(2); ).toFixed(2);
cy.ensure_specified_unstaked_tokens_are_associated( cy.ensure_specified_unstaked_tokens_are_associated(
tokensRequiredToAchieveResult tokensRequiredToAchieveResult
@ -321,16 +301,17 @@ context(
cy.get('@submittedProposal').within(() => cy.get('@submittedProposal').within(() =>
cy.get(viewProposalButton).click() cy.get(viewProposalButton).click()
); );
cy.get_proposal_information_from_table('Participation met') cy.get_proposal_information_from_table('Token participation met')
.contains('👍') .contains('👍')
.should('be.visible'); .should('be.visible');
cy.navigate_to('proposals'); cy.navigate_to('proposals');
cy.get('@submittedProposal').within(() => cy.get('@submittedProposal').within(() =>
cy.get(voteStatus).should('have.text', 'Participation met') cy.get(voteStatus).should('have.text', 'Set to pass')
); );
}); });
}); });
// 3001-VOTE-055
it('Newly created raw proposal details - shows proposal title and full description', function () { it('Newly created raw proposal details - shows proposal title and full description', function () {
createRawProposal(this.minProposerBalance); createRawProposal(this.minProposerBalance);
cy.get('@rawProposal').then((rawProposal) => { cy.get('@rawProposal').then((rawProposal) => {
@ -357,6 +338,7 @@ context(
}); });
}); });
// 3001-VOTE-043
it('Newly created freeform proposal details - shows proposed and closing dates', function () { it('Newly created freeform proposal details - shows proposed and closing dates', function () {
const closingVoteHrs = '72'; const closingVoteHrs = '72';
const proposalTitle = generateProposalTitle(); const proposalTitle = generateProposalTitle();
@ -399,6 +381,7 @@ context(
it('Newly created proposal details - shows default status set to fail', function () { it('Newly created proposal details - shows default status set to fail', function () {
// 3001-VOTE-037 // 3001-VOTE-037
// 3001-VOTE-040 // 3001-VOTE-040
// 3001-VOTE-067
createRawProposal(this.minProposerBalance); createRawProposal(this.minProposerBalance);
cy.get('@rawProposal').then((rawProposal) => { cy.get('@rawProposal').then((rawProposal) => {
cy.get_submitted_proposal_from_proposal_list( cy.get_submitted_proposal_from_proposal_list(
@ -413,15 +396,17 @@ context(
.should('be.visible'); .should('be.visible');
// 3001-VOTE-062 // 3001-VOTE-062
// 3001-VOTE-040 // 3001-VOTE-040
// 3001-VOTE-070
cy.get_proposal_information_from_table('Token majority met') cy.get_proposal_information_from_table('Token majority met')
.contains('👎') .contains('👎')
.should('be.visible'); .should('be.visible');
// 3001-VOTE-068
cy.get_proposal_information_from_table('Token participation met') cy.get_proposal_information_from_table('Token participation met')
.contains('👎') .contains('👎')
.should('be.visible'); .should('be.visible');
}); });
// 3001-VOTE-080 3001-VOTE-090 // 3001-VOTE-080 3001-VOTE-090 3001-VOTE-069 3001-VOTE-072 3001-VOTE-073
it('Newly created proposal details - ability to vote for and against proposal - with minimum required tokens associated', function () { it('Newly created proposal details - ability to vote for and against proposal - with minimum required tokens associated', function () {
createRawProposal(this.minProposerBalance); createRawProposal(this.minProposerBalance);
cy.get('@rawProposal').then((rawProposal) => { cy.get('@rawProposal').then((rawProposal) => {
@ -446,7 +431,7 @@ context(
.contains(votedDate) .contains(votedDate)
.should('be.visible'); .should('be.visible');
}); });
cy.get(proposalVoteProgressForPercentage) cy.get(proposalVoteProgressForPercentage) // 3001-VOTE-072
.contains('100.00%') .contains('100.00%')
.and('be.visible'); .and('be.visible');
cy.get(proposalVoteProgressAgainstPercentage) cy.get(proposalVoteProgressAgainstPercentage)
@ -466,10 +451,10 @@ context(
.and('be.visible'); .and('be.visible');
// 3001-VOTE-061 // 3001-VOTE-061
cy.get_proposal_information_from_table('Participation required') cy.get_proposal_information_from_table('Participation required')
.contains(`${this.requiredParticipation}%`) .contains(`${requiredParticipation}%`)
.should('be.visible'); .should('be.visible');
// 3001-VOTE-066 // 3001-VOTE-066
cy.get_proposal_information_from_table('Majority Required') cy.get_proposal_information_from_table('Majority Required') // 3001-VOTE-073
.contains(`${parseFloat(this.requiredMajority).toFixed(2)}%`) .contains(`${parseFloat(this.requiredMajority).toFixed(2)}%`)
.should('be.visible'); .should('be.visible');
cy.get_proposal_information_from_table('Number of voting parties') cy.get_proposal_information_from_table('Number of voting parties')
@ -512,7 +497,7 @@ context(
.invoke('text') .invoke('text')
.then((totalSupply) => { .then((totalSupply) => {
let tokensRequiredToAchieveResult = parseFloat( let tokensRequiredToAchieveResult = parseFloat(
(totalSupply.replace(/,/g, '') * this.requiredParticipation) / 100 (totalSupply.replace(/,/g, '') * requiredParticipation) / 100
).toFixed(2); ).toFixed(2);
cy.ensure_specified_unstaked_tokens_are_associated( cy.ensure_specified_unstaked_tokens_are_associated(
tokensRequiredToAchieveResult tokensRequiredToAchieveResult
@ -536,6 +521,11 @@ context(
cy.get(proposalVoteProgressAgainstTokens) cy.get(proposalVoteProgressAgainstTokens)
.contains('0.00') .contains('0.00')
.and('be.visible'); .and('be.visible');
cy.get_proposal_information_from_table(
'Total tokens voted percentage'
)
.should('have.text', '0.00%')
.and('be.visible');
cy.get_proposal_information_from_table('Tokens for proposal') cy.get_proposal_information_from_table('Tokens for proposal')
.should('have.text', tokensRequiredToAchieveResult) .should('have.text', tokensRequiredToAchieveResult)
.and('be.visible'); .and('be.visible');
@ -588,6 +578,7 @@ context(
); );
}); });
// 3001-VOTE-006
it('Creating a proposal - proposal rejected - able to access rejected proposals', function () { it('Creating a proposal - proposal rejected - able to access rejected proposals', function () {
cy.ensure_specified_unstaked_tokens_are_associated( cy.ensure_specified_unstaked_tokens_are_associated(
this.minProposerBalance this.minProposerBalance
@ -649,6 +640,7 @@ context(
cy.get(dialogCloseButton).click(); cy.get(dialogCloseButton).click();
}); });
// 3002-PROP-009
it('Unable to create a proposal - when some but not enough tokens are associated', function () { it('Unable to create a proposal - when some but not enough tokens are associated', function () {
cy.ensure_specified_unstaked_tokens_are_associated( cy.ensure_specified_unstaked_tokens_are_associated(
this.minProposerBalance - 0.000001 this.minProposerBalance - 0.000001
@ -669,7 +661,7 @@ context(
}); });
it('Unable to create a freeform proposal - when json parent section contains unexpected field', function () { it('Unable to create a freeform proposal - when json parent section contains unexpected field', function () {
// 3001-VOTE-038 // 3001-VOTE-038 3002-PROP-013 3002-PROP-014
cy.ensure_specified_unstaked_tokens_are_associated( cy.ensure_specified_unstaked_tokens_are_associated(
this.minProposerBalance this.minProposerBalance
); );
@ -695,6 +687,9 @@ context(
'Invalid params: the transaction is malformed' 'Invalid params: the transaction is malformed'
); );
cy.get(dialogCloseButton).click(); cy.get(dialogCloseButton).click();
cy.get(rawProposalData)
.invoke('val')
.should('contain', "i shouldn't be here");
}); });
it('Unable to create a freeform proposal - when json terms section contains unexpected field', function () { it('Unable to create a freeform proposal - when json terms section contains unexpected field', function () {
@ -792,6 +787,107 @@ context(
cy.contains('You voted: Against').should('be.visible'); cy.contains('You voted: Against').should('be.visible');
}); });
// 3001-VOTE-006
it('Able to view enacted proposal', function () {
cy.createMarket();
cy.reload();
cy.wait_for_spinner();
cy.get(closedProposals).within(() => {
cy.get(proposalDetailsTitle).should(
'have.text',
'Add Lorem Ipsum market'
);
cy.get(proposalStatus).should('have.text', 'Enacted ');
cy.get(viewProposalButton).click();
});
cy.getByTestId('proposal-type').should('have.text', 'New market');
cy.get_proposal_information_from_table('State')
.contains('Enacted')
.and('be.visible');
cy.get(votesTable).within(() => {
cy.contains('Vote passed.').should('be.visible');
cy.contains('Voting has ended.').should('be.visible');
});
});
// 3001-VOTE-047
it('Able to enact freeform proposal', function () {
const proposalTitle = 'Add New free form proposal with short enactment';
cy.ensure_specified_unstaked_tokens_are_associated(
this.minProposerBalance
);
cy.sendWalletTxFreeFormProposal();
cy.navigate_to('proposals');
cy.reload();
cy.wait_for_spinner();
cy.contains(proposalTitle)
.parentsUntil('[data-testid="proposals-list-item"]')
.within(() => cy.get(viewProposalButton).click());
cy.get_proposal_information_from_table('State')
.contains('Open')
.and('be.visible');
cy.vote_for_proposal('for');
cy.get_proposal_information_from_table('State')
.contains('Enacted', epochTimeout)
.and('be.visible');
});
// 3001-VOTE-046 3001-VOTE-044 3001-VOTE-074 3001-VOTE-074
it('Able to enact proposal by voting', function () {
const proposalTitle = 'Add New proposal with short enactment';
cy.ensure_specified_unstaked_tokens_are_associated(
this.minProposerBalance
);
cy.sendWalletTxUpdateNetworkProposal();
cy.navigate_to('proposals');
cy.reload();
cy.wait_for_spinner();
cy.contains(proposalTitle)
.parentsUntil('[data-testid="proposals-list-item"]')
.within(() => cy.get(viewProposalButton).click());
cy.get_proposal_information_from_table('State')
.contains('Open')
.and('be.visible');
cy.vote_for_proposal('for');
cy.get_proposal_information_from_table('State') // 3001-VOTE-047
.contains('Passed', txTimeout)
.and('be.visible');
cy.get_proposal_information_from_table('State')
.contains('Enacted', epochTimeout)
.and('be.visible');
cy.get(votesTable).within(() => {
cy.contains('Vote passed.').should('be.visible');
cy.contains('Voting has ended.').should('be.visible');
});
cy.get(proposalVoteProgressForPercentage)
.contains('100.00%')
.and('be.visible');
});
// 3001-VOTE-048 3001-VOTE-049
it('Able to fail proposal due to lack of participation', function () {
const proposalTitle = 'Add New free form proposal with short enactment';
cy.ensure_specified_unstaked_tokens_are_associated(
this.minProposerBalance
);
cy.sendWalletTxFreeFormProposal();
cy.navigate_to('proposals');
cy.reload();
cy.wait_for_spinner();
cy.contains(proposalTitle)
.parentsUntil('[data-testid="proposals-list-item"]')
.within(() => cy.get(viewProposalButton).click());
cy.get_proposal_information_from_table('State')
.contains('Open')
.and('be.visible');
cy.get_proposal_information_from_table('State') // 3001-VOTE-047
.contains('Declined', txTimeout)
.and('be.visible');
cy.get_proposal_information_from_table('Rejection reason')
.contains('PROPOSAL_ERROR_PARTICIPATION_THRESHOLD_NOT_REACHED')
.and('be.visible');
});
function createRawProposal(proposerBalance) { function createRawProposal(proposerBalance) {
if (proposerBalance) if (proposerBalance)
cy.ensure_specified_unstaked_tokens_are_associated(proposerBalance); cy.ensure_specified_unstaked_tokens_are_associated(proposerBalance);

View File

@ -1,3 +1,7 @@
const proposalListItem = '[data-testid="proposals-list-item"]';
const openProposals = '[data-testid="open-proposals"]';
const proposalType = '[data-testid="proposal-type"]';
const proposalDetails = '[data-testid="proposal-details"]';
const newProposalSubmitButton = '[data-testid="proposal-submit"]'; const newProposalSubmitButton = '[data-testid="proposal-submit"]';
const proposalVoteDeadline = '[data-testid="proposal-vote-deadline"]'; const proposalVoteDeadline = '[data-testid="proposal-vote-deadline"]';
const proposalValidationDeadline = const proposalValidationDeadline =
@ -209,18 +213,15 @@ context(
); );
}); });
// skipped because no markets available to select in capsule
it.skip('Able to submit update market proposal', function () { it.skip('Able to submit update market proposal', function () {
const marketId =
'315a8e48db0a292c92b617264728048c82c20efc922c75fd292fc54e5c727c81';
cy.go_to_make_new_proposal(governanceProposalType.UPDATE_MARKET); cy.go_to_make_new_proposal(governanceProposalType.UPDATE_MARKET);
cy.get(newProposalTitle).type('Test update asset proposal'); cy.get(newProposalTitle).type('Test update market proposal');
cy.get(newProposalDescription).type('E2E test for proposals'); cy.get(newProposalDescription).type('E2E test for proposals');
cy.get(proposalMarketSelect).select(marketId); cy.get(proposalMarketSelect).select('Test market 1');
cy.get('[data-testid="update-market-details"]').within(() => { cy.get('[data-testid="update-market-details"]').within(() => {
cy.get('dd').eq(0).should('have.text', 'Oranges Daily'); cy.get('dd').eq(0).should('have.text', 'Test market 1');
cy.get('dd').eq(1).should('have.text', 'ORANGES.24h'); cy.get('dd').eq(1).should('have.text', 'TEST.24h');
cy.get('dd').eq(2).should('have.text', marketId); cy.get('dd').eq(2).should('not.be.empty');
}); });
cy.fixture('/proposals/update-market').then((updateMarketProposal) => { cy.fixture('/proposals/update-market').then((updateMarketProposal) => {
let newUpdateMarketProposal = JSON.stringify(updateMarketProposal); let newUpdateMarketProposal = JSON.stringify(updateMarketProposal);
@ -281,12 +282,28 @@ context(
}); });
it('Able to submit update asset proposal using min deadline', function () { it('Able to submit update asset proposal using min deadline', function () {
const assetId =
'ebcd94151ae1f0d39a4bde3b21a9c7ae81a80ea4352fb075a92e07608d9c953d';
cy.go_to_make_new_proposal(governanceProposalType.UPDATE_ASSET); cy.go_to_make_new_proposal(governanceProposalType.UPDATE_ASSET);
enterUpdateAssetProposalDetails(); enterUpdateAssetProposalDetails();
cy.get(minVoteDeadline).click(); cy.get(minVoteDeadline).click();
cy.get(minEnactDeadline).click(); cy.get(minEnactDeadline).click();
cy.get(newProposalSubmitButton).should('be.visible').click(); cy.get(newProposalSubmitButton).should('be.visible').click();
cy.wait_for_proposal_submitted(); cy.wait_for_proposal_submitted();
cy.navigate_to('proposals');
cy.get(openProposals).within(() => {
cy.get(proposalType)
.contains('Update asset')
.parentsUntil(proposalListItem)
.within(() => {
cy.get(proposalDetails).should('contain.text', assetId); // 3001-VOTE-029
cy.getByTestId('view-proposal-btn').click();
});
});
cy.get_proposal_information_from_table('Proposed enactment') // 3001-VOTE-044
.invoke('text')
.should('not.be.empty');
}); });
it('Able to submit update asset proposal using max deadline', function () { it('Able to submit update asset proposal using max deadline', function () {

View File

@ -20,7 +20,10 @@ context('View functionality with public key', { tags: '@smoke' }, function () {
it('Able to connect public key via wallet', function () { it('Able to connect public key via wallet', function () {
verifyConnectedToPubKey(); verifyConnectedToPubKey();
cy.getByTestId('currency-title').should('contain.text', 'USDC (fake)'); cy.getByTestId('currency-title', Cypress.env('epochTimeout')).should(
'contain.text',
'USDC (fake)'
);
}); });
it('Able to connect public key using url', function () { it('Able to connect public key using url', function () {

View File

@ -46,6 +46,6 @@ Cypress.Commands.add('verify_page_header', (text) => {
}); });
Cypress.Commands.add('wait_for_spinner', () => { Cypress.Commands.add('wait_for_spinner', () => {
cy.get(navigation.pageSpinner).should('exist'); cy.get(navigation.pageSpinner, Cypress.env('epochTimeout')).should('exist');
cy.get(navigation.pageSpinner, { timeout: 20000 }).should('not.exist'); cy.get(navigation.pageSpinner, { timeout: 20000 }).should('not.exist');
}); });

View File

@ -6,6 +6,7 @@ import './governance.functions.js';
import './wallet-eth.functions.js'; import './wallet-eth.functions.js';
import './wallet-teardown.functions.js'; import './wallet-teardown.functions.js';
import './wallet-vega.functions.js'; import './wallet-vega.functions.js';
import './proposal.functions.js';
import registerCypressGrep from '@cypress/grep'; import registerCypressGrep from '@cypress/grep';
import { aliasGQLQuery } from '@vegaprotocol/cypress'; import { aliasGQLQuery } from '@vegaprotocol/cypress';
import { chainIdQuery, statisticsQuery } from '@vegaprotocol/mock'; import { chainIdQuery, statisticsQuery } from '@vegaprotocol/mock';

View File

@ -0,0 +1,103 @@
import { addSeconds, millisecondsToSeconds } from 'date-fns';
const walletName = Cypress.env('vegaWalletName');
const walletPubKey = Cypress.env('vegaWalletPublicKey');
const walletLocation = Cypress.env('vegaWalletLocation');
const walletPassphraseFile = './src/fixtures/wallet/passphrase';
Cypress.Commands.add('sendWalletTxUpdateNetworkProposal', () => {
const MIN_CLOSE_SEC = 8;
const MIN_ENACT_SEC = 5;
const closingDate = addSeconds(new Date(), MIN_CLOSE_SEC);
const enactmentDate = addSeconds(closingDate, MIN_ENACT_SEC);
const closingTimestamp = millisecondsToSeconds(closingDate.getTime());
const enactmentTimestamp = millisecondsToSeconds(enactmentDate.getTime());
cy.exec(
`vegawallet transaction send --wallet ${walletName} --pubkey ${walletPubKey} -p ${walletPassphraseFile} --network DV '{
"proposalSubmission": {
"rationale": {
"title": "Add New proposal with short enactment",
"description": "E2E enactment test"
},
"terms": {
"updateNetworkParameter": {
"changes": {
"key": "governance.proposal.updateNetParam.minProposerBalance",
"value": "2"
}
},
"closingTimestamp": ${closingTimestamp},
"enactmentTimestamp": ${enactmentTimestamp}
}
}
}' --home ${walletLocation}`,
{ failOnNonZeroExit: false }
)
.its('stderr')
.should('contain', '');
});
Cypress.Commands.add('sendWalletTxUpdateAssetProposal', () => {
const MIN_CLOSE_SEC = 8;
const MIN_ENACT_SEC = 5;
const closingDate = addSeconds(new Date(), MIN_CLOSE_SEC);
const enactmentDate = addSeconds(closingDate, MIN_ENACT_SEC);
const closingTimestamp = millisecondsToSeconds(closingDate.getTime());
const enactmentTimestamp = millisecondsToSeconds(enactmentDate.getTime());
cy.exec(
`vegawallet transaction send --wallet ${walletName} --pubkey ${walletPubKey} -p ${walletPassphraseFile} --network DV '{
"proposalSubmission": {
"rationale": {
"title": "Update Asset set to fail",
"description": "E2E fail test"
},
"terms": {
"updateAsset": {
"assetId": "ebcd94151ae1f0d39a4bde3b21a9c7ae81a80ea4352fb075a92e07608d9c953d",
"changes": {
"quantum": "1",
"erc20": {
"withdrawThreshold": "10",
"lifetimeLimit": "10"
}
}
},
"closingTimestamp": ${closingTimestamp},
"enactmentTimestamp": ${enactmentTimestamp}
}
}
}' --home ${walletLocation}`,
{ failOnNonZeroExit: false }
)
.its('stderr')
.should('contain', '');
});
Cypress.Commands.add('sendWalletTxFreeFormProposal', () => {
const MIN_CLOSE_SEC = 5;
const closingDate = addSeconds(new Date(), MIN_CLOSE_SEC);
const closingTimestamp = millisecondsToSeconds(closingDate.getTime());
cy.exec(
`vegawallet transaction send --wallet ${walletName} --pubkey ${walletPubKey} -p ${walletPassphraseFile} --network DV '{
"proposalSubmission": {
"rationale": {
"title": "Add New free form proposal with short enactment",
"description": "E2E enactment test"
},
"terms": {
"newFreeform": {},
"closingTimestamp": ${closingTimestamp}
}
}
}' --home ${walletLocation}`,
{ failOnNonZeroExit: false }
)
.its('stderr')
.should('contain', '');
});

View File

@ -102,7 +102,7 @@ export const VoteDetails = ({
</table> </table>
</section> </section>
)} )}
<section> <section data-testid="votes-table">
<SubHeading title={t('tokenVotes')} /> <SubHeading title={t('tokenVotes')} />
<p> <p>
<span> <span>

View File

@ -48,7 +48,7 @@ function createNewMarketProposal(): ProposalSubmissionBody {
signers: [ signers: [
{ {
pubKey: { pubKey: {
key: '0xfCEAdAFab14d46e20144F48824d0C09B1a03F2BC', key: '70d14a321e02e71992fd115563df765000ccc4775cbe71a0e2f9ff5a3b9dc680',
}, },
}, },
], ],

View File

@ -188,6 +188,8 @@
"governance.proposal.updateNetParam.minClose": "2s", "governance.proposal.updateNetParam.minClose": "2s",
"governance.proposal.updateNetParam.minEnact": "2s", "governance.proposal.updateNetParam.minEnact": "2s",
"governance.proposal.updateNetParam.requiredParticipation": "0.00000000000000000000000015", "governance.proposal.updateNetParam.requiredParticipation": "0.00000000000000000000000015",
"governance.proposal.freeform.minClose": "2s",
"governance.proposal.freeform.requiredParticipation": "0.00000000000000000000000015",
"market.auction.minimumDuration": "3s", "market.auction.minimumDuration": "3s",
"market.fee.factors.infrastructureFee": "0.001", "market.fee.factors.infrastructureFee": "0.001",
"market.fee.factors.makerFee": "0.004", "market.fee.factors.makerFee": "0.004",