Compare commits
7
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4441dfe081 | ||
|
|
220da79839 | ||
|
|
3e839fc620 | ||
|
|
baf150fcf5 | ||
|
|
8d08b6a615 | ||
|
|
1e222aba2d | ||
|
|
61c5a7ba68 |
+1
-2
@@ -51,8 +51,7 @@
|
|||||||
"ul": ["list"],
|
"ul": ["list"],
|
||||||
"ol": ["list"]
|
"ol": ["list"]
|
||||||
}
|
}
|
||||||
],
|
]
|
||||||
"no-console": ["error", { "allow": ["warn", "error"] }]
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# Related issues 🔗
|
# Related issues 🔗
|
||||||
|
|
||||||
Closes #[Issue number here]
|
Issue: #[Issue number here]
|
||||||
|
|
||||||
# Description ℹ️
|
# Description ℹ️
|
||||||
|
|
||||||
|
|||||||
@@ -125,7 +125,7 @@ jobs:
|
|||||||
#----------------------------------------------
|
#----------------------------------------------
|
||||||
- name: Run tests
|
- name: Run tests
|
||||||
working-directory: ./console-test
|
working-directory: ./console-test
|
||||||
run: poetry run pytest -s --numprocesses auto
|
run: poetry run pytest -v -s --numprocesses auto --dist loadfile --durations=20
|
||||||
- name: Check files
|
- name: Check files
|
||||||
run: |
|
run: |
|
||||||
ls -al .
|
ls -al .
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ jobs:
|
|||||||
project: ${{ fromJSON(inputs.projects) }}
|
project: ${{ fromJSON(inputs.projects) }}
|
||||||
name: ${{ matrix.project }}
|
name: ${{ matrix.project }}
|
||||||
runs-on: self-hosted-runner
|
runs-on: self-hosted-runner
|
||||||
timeout-minutes: 100
|
timeout-minutes: 120
|
||||||
steps:
|
steps:
|
||||||
# Checks if skip cache was requested
|
# Checks if skip cache was requested
|
||||||
- name: Set skip-nx-cache flag
|
- name: Set skip-nx-cache flag
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ on:
|
|||||||
- types
|
- types
|
||||||
- utils
|
- utils
|
||||||
- i18n
|
- i18n
|
||||||
|
- wallet
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
publish:
|
publish:
|
||||||
|
|||||||
@@ -16,10 +16,5 @@ NX_EXPLORER_NETWORK_PARAMETERS=1
|
|||||||
NX_EXPLORER_PARTIES=1
|
NX_EXPLORER_PARTIES=1
|
||||||
NX_EXPLORER_VALIDATORS=1
|
NX_EXPLORER_VALIDATORS=1
|
||||||
|
|
||||||
CYPRESS_VEGA_URL=http://localhost:3008/graphql
|
|
||||||
CYPRESS_ETH_WALLET_MNEMONIC=ozone access unlock valid olympic save include omit supply green clown session
|
|
||||||
CYPRESS_ETHEREUM_PROVIDER_URL=http://localhost:8545
|
|
||||||
CYPRESS_FAUCET_URL=http://localhost:1790/api/v1/mint
|
|
||||||
CYPRESS_VEGA_PUBLIC_KEY=02eceaba4df2bef76ea10caf728d8a099a2aa846cced25737cccaa9812342f65
|
|
||||||
CYPRESS_VEGA_WALLET_URL=http://localhost:1789
|
|
||||||
CYPRESS_VEGA_WALLET_API_TOKEN=
|
CYPRESS_VEGA_WALLET_API_TOKEN=
|
||||||
|
CYPRESS_VEGA_URL=http://localhost:3008/graphql
|
||||||
|
|||||||
@@ -23,7 +23,6 @@ module.exports = defineConfig({
|
|||||||
viewportWidth: 1440,
|
viewportWidth: 1440,
|
||||||
viewportHeight: 900,
|
viewportHeight: 900,
|
||||||
testIsolation: false,
|
testIsolation: false,
|
||||||
experimentalMemoryManagement: true,
|
|
||||||
},
|
},
|
||||||
env: {
|
env: {
|
||||||
environment: 'CUSTOM',
|
environment: 'CUSTOM',
|
||||||
|
|||||||
@@ -1,174 +1,19 @@
|
|||||||
import { createSuccessorMarketProposal } from '../support/governance.functions';
|
//Tests set to skip until market bug for capsule checkpoint is fixed
|
||||||
|
context.skip('Market page', { tags: '@regression' }, function () {
|
||||||
context('Market page', { tags: '@regression' }, function () {
|
|
||||||
describe('Verify elements on page', function () {
|
describe('Verify elements on page', function () {
|
||||||
const marketHeaders = 'markets-heading';
|
const marketHeaders = '[data-testid="markets-header"]';
|
||||||
|
const marketNavigation = 'a[href="/markets"]';
|
||||||
|
|
||||||
before('Create market', function () {
|
it('Markets page is displayed', function () {
|
||||||
cy.visit('/');
|
cy.visit('/');
|
||||||
cy.createMarket();
|
cy.get(marketNavigation).click();
|
||||||
|
cy.common_validate_blocks_data_displayed(marketHeaders);
|
||||||
});
|
});
|
||||||
|
|
||||||
beforeEach('Get market id', function () {
|
it('Markets page displayed on mobile', function () {
|
||||||
cy.navigate_to('markets');
|
|
||||||
cy.get('[col-id="id"]').last().invoke('text').as('createdMarketId');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('Market displayed on market page', function () {
|
|
||||||
cy.navigate_to('markets');
|
|
||||||
cy.getByTestId(marketHeaders).should('be.visible');
|
|
||||||
cy.get(`[row-id="${this.createdMarketId}"]`)
|
|
||||||
.should('be.visible')
|
|
||||||
.within(() => {
|
|
||||||
cy.get_element_by_col_id('code').should('have.text', 'TEST.24h');
|
|
||||||
cy.get_element_by_col_id('name').should('have.text', 'Test market 1');
|
|
||||||
cy.get_element_by_col_id('state').should('have.text', 'Pending');
|
|
||||||
cy.get_element_by_col_id('asset').should('have.text', 'fUSDC');
|
|
||||||
cy.get_element_by_col_id('id').should(
|
|
||||||
'have.text',
|
|
||||||
this.createdMarketId
|
|
||||||
);
|
|
||||||
cy.get_element_by_col_id('actions')
|
|
||||||
.find('a')
|
|
||||||
.should('have.attr', 'href', `/markets/${this.createdMarketId}`);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
it('Able to go to market details page', function () {
|
|
||||||
cy.navigate_to('markets');
|
|
||||||
cy.get_element_by_col_id('actions').eq(1).click();
|
|
||||||
cy.getByTestId(marketHeaders).should('have.text', 'Test market 1');
|
|
||||||
cy.validate_element_from_table('Name', 'Test market 1');
|
|
||||||
cy.validate_element_from_table('Market ID', this.createdMarketId);
|
|
||||||
cy.validate_element_from_table('Trading Mode', 'Opening auction');
|
|
||||||
cy.validate_element_from_table('Market Decimal Places', '5');
|
|
||||||
cy.validate_element_from_table('Position Decimal Places', '5');
|
|
||||||
cy.validate_element_from_table('Settlement Asset Decimal Places', '5');
|
|
||||||
// Instrument
|
|
||||||
cy.validate_element_from_table('Market Name', 'Test market 1');
|
|
||||||
cy.validate_element_from_table('Code', 'TEST.24h');
|
|
||||||
cy.validate_element_from_table('Product Type', 'Future');
|
|
||||||
cy.validate_element_from_table('Quote Name', 'fUSDC');
|
|
||||||
// Settlement Asset
|
|
||||||
cy.validate_element_from_table('Quote Name', 'fUSDC');
|
|
||||||
cy.validate_element_from_table('Symbol', 'fUSDC');
|
|
||||||
cy.validate_element_from_table('Decimals', '5');
|
|
||||||
cy.validate_element_from_table('Quantum', '0.00');
|
|
||||||
cy.validate_element_from_table('Status', 'Enabled');
|
|
||||||
cy.validate_element_from_table('Max faucet amount', '10,000,000.00');
|
|
||||||
cy.validate_element_from_table(
|
|
||||||
'Infrastructure fee account balance',
|
|
||||||
'0.00'
|
|
||||||
);
|
|
||||||
cy.validate_element_from_table(
|
|
||||||
'Global reward pool account balance',
|
|
||||||
'0.00'
|
|
||||||
);
|
|
||||||
// Metadata
|
|
||||||
cy.validate_element_from_table('Sector', 'tech');
|
|
||||||
cy.validate_element_from_table('Source', 'docs.vega.xyz');
|
|
||||||
// Risk model
|
|
||||||
cy.validate_element_from_table('Tau', '0.0001140771161');
|
|
||||||
cy.validate_element_from_table('Risk Aversion Parameter', '0.01');
|
|
||||||
// Risk parameters
|
|
||||||
// cy.validate_element_from_table('R', '0.016')
|
|
||||||
cy.validate_element_from_table('Sigma', '0.5');
|
|
||||||
// Risk factors
|
|
||||||
cy.validate_element_from_table('Short', '0.0143218738374871');
|
|
||||||
cy.validate_element_from_table('Long', '0.0141450471498822');
|
|
||||||
// Price monitoring settings 1
|
|
||||||
cy.validate_element_from_table('Horizon Secs', '43,200');
|
|
||||||
cy.validate_element_from_table('Probability', '1');
|
|
||||||
cy.validate_element_from_table('Auction Extension Secs', '600');
|
|
||||||
// Liquidity Monitoring
|
|
||||||
cy.validate_element_from_table('Triggering Ratio', '0.7');
|
|
||||||
cy.validate_element_from_table('Time Window', '3,600');
|
|
||||||
cy.validate_element_from_table('Scaling Factor', '10');
|
|
||||||
// Liquidity
|
|
||||||
cy.validate_element_from_table('Target Stake', '0.00 fUSDC');
|
|
||||||
cy.validate_element_from_table('Supplied Stake', '0.00 fUSDC');
|
|
||||||
cy.validate_element_from_table('Market Value Proxy', '0.00 fUSDC');
|
|
||||||
// Liquidity price range
|
|
||||||
cy.validate_element_from_table(
|
|
||||||
'Liquidity Price Range',
|
|
||||||
'1,000.00% of mid price'
|
|
||||||
);
|
|
||||||
cy.validate_element_from_table('Lowest Price', '0.00 fUSDC');
|
|
||||||
cy.validate_element_from_table('Highest Price', '0.00 fUSDC');
|
|
||||||
|
|
||||||
cy.getByTestId('oracle-spec-links')
|
|
||||||
.should('have.attr', 'href')
|
|
||||||
.and(
|
|
||||||
'contain',
|
|
||||||
'/oracles/bf242aa5c9f64fcbb77808aa8582e73711519f4b35264eb797a80f1803590a24'
|
|
||||||
);
|
|
||||||
|
|
||||||
// Able to view Json
|
|
||||||
cy.contains('View JSON').click();
|
|
||||||
cy.get('.language-json').should('exist');
|
|
||||||
cy.getByTestId('icon-cross').click();
|
|
||||||
});
|
|
||||||
|
|
||||||
// Skipping due to resize observer loop limit error
|
|
||||||
it.skip('Markets page displayed on mobile', function () {
|
|
||||||
cy.common_switch_to_mobile_and_click_toggle();
|
cy.common_switch_to_mobile_and_click_toggle();
|
||||||
cy.navigate_to('markets', true);
|
cy.get(marketNavigation).click();
|
||||||
cy.getByTestId(marketHeaders).should('be.visible');
|
cy.common_validate_blocks_data_displayed(marketHeaders);
|
||||||
cy.get(`[row-id="${this.createdMarketId}"]`)
|
|
||||||
.should('be.visible')
|
|
||||||
.within(() => {
|
|
||||||
cy.get_element_by_col_id('code').should('have.text', 'TEST.24h');
|
|
||||||
cy.get_element_by_col_id('name').should('have.text', 'Test market 1');
|
|
||||||
cy.get_element_by_col_id('state').should('have.text', 'Pending');
|
|
||||||
cy.get_element_by_col_id('asset').should('have.text', 'fUSDC');
|
|
||||||
cy.get_element_by_col_id('id').should(
|
|
||||||
'have.text',
|
|
||||||
this.createdMarketId
|
|
||||||
);
|
|
||||||
cy.get_element_by_col_id('actions')
|
|
||||||
.find('a')
|
|
||||||
.should('have.attr', 'href', `/markets/${this.createdMarketId}`);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
it('Able to go to market details page for successor market', function () {
|
|
||||||
const successionLineItem = 'succession-line-item';
|
|
||||||
const successionLineMarketId = 'succession-line-item-market-id';
|
|
||||||
|
|
||||||
createSuccessorMarketProposal(this.createdMarketId);
|
|
||||||
cy.navigate_to('markets');
|
|
||||||
cy.reload();
|
|
||||||
cy.contains('Token test market', { timeout: 8000 }).should('be.visible');
|
|
||||||
cy.get('[row-index="0"]')
|
|
||||||
.invoke('attr', 'row-id')
|
|
||||||
.as('successorMarketId');
|
|
||||||
cy.contains('Token test market').click();
|
|
||||||
cy.getByTestId(marketHeaders).should('have.text', 'Token test market');
|
|
||||||
cy.validate_proposal_change_type('Triggering Ratio', 'Added');
|
|
||||||
cy.validate_element_from_table('Triggering Ratio', '0.7');
|
|
||||||
cy.validate_proposal_change_type('Time Window', 'Added');
|
|
||||||
cy.validate_element_from_table('Time Window', '3,600');
|
|
||||||
cy.validate_proposal_change_type('Scaling Factor', 'Added');
|
|
||||||
cy.validate_element_from_table('Scaling Factor', '10');
|
|
||||||
|
|
||||||
cy.getByTestId(successionLineItem)
|
|
||||||
.first()
|
|
||||||
.within(() => {
|
|
||||||
cy.contains('Test market 1');
|
|
||||||
cy.getByTestId(successionLineMarketId).should(
|
|
||||||
'have.text',
|
|
||||||
this.createdMarketId
|
|
||||||
);
|
|
||||||
});
|
|
||||||
cy.getByTestId(successionLineItem)
|
|
||||||
.eq(1)
|
|
||||||
.within(() => {
|
|
||||||
cy.contains('Token test market');
|
|
||||||
cy.getByTestId(successionLineMarketId).should(
|
|
||||||
'have.text',
|
|
||||||
this.successorMarketId
|
|
||||||
);
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,49 +0,0 @@
|
|||||||
context('Proposal page', { tags: '@smoke' }, function () {
|
|
||||||
describe('Verify elements on page', function () {
|
|
||||||
const proposalHeading = 'proposals-heading';
|
|
||||||
const dateTimeRegex =
|
|
||||||
/(\d{1,2})\/(\d{1,2})\/(\d{4}), (\d{1,2}):(\d{1,2}):(\d{1,2})/gm;
|
|
||||||
const proposalTitle = 'Add Lorem Ipsum market';
|
|
||||||
|
|
||||||
before('Create market proposal', function () {
|
|
||||||
cy.visit('/');
|
|
||||||
cy.createMarket();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('Able to view proposal', function () {
|
|
||||||
cy.navigate_to('governanceProposals');
|
|
||||||
cy.getByTestId(proposalHeading).should('be.visible');
|
|
||||||
cy.contains(proposalTitle)
|
|
||||||
.parent()
|
|
||||||
.parent()
|
|
||||||
.parent()
|
|
||||||
.within(() => {
|
|
||||||
cy.get_element_by_col_id('title').should('have.text', proposalTitle);
|
|
||||||
cy.get_element_by_col_id('type').should('have.text', 'NewMarket');
|
|
||||||
cy.get_element_by_col_id('state').should('have.text', 'Enacted');
|
|
||||||
cy.getByTestId('vote-progress').should('be.visible');
|
|
||||||
cy.get('[col-id="cDate"]')
|
|
||||||
.invoke('text')
|
|
||||||
.should('match', dateTimeRegex);
|
|
||||||
cy.get('[col-id="eDate"]')
|
|
||||||
.invoke('text')
|
|
||||||
.should('match', dateTimeRegex);
|
|
||||||
cy.getByTestId('external-link')
|
|
||||||
.should('have.attr', 'href')
|
|
||||||
.and('contains', 'https://governance.fairground.wtf/proposals/');
|
|
||||||
cy.contains('View terms').should('exist').click();
|
|
||||||
});
|
|
||||||
cy.getByTestId('dialog-title').should('have.text', proposalTitle);
|
|
||||||
cy.get('.language-json').should('exist');
|
|
||||||
});
|
|
||||||
|
|
||||||
it.skip('Proposal page displayed on mobile', function () {
|
|
||||||
cy.common_switch_to_mobile_and_click_toggle();
|
|
||||||
cy.navigate_to('governanceProposals', true);
|
|
||||||
cy.getByTestId(proposalHeading).should('be.visible');
|
|
||||||
cy.get('[row-index="0"]').within(() => {
|
|
||||||
cy.get_element_by_col_id('title').should('have.text', proposalTitle);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
@@ -40,7 +40,7 @@ context.skip('Transactions page', function () {
|
|||||||
.first()
|
.first()
|
||||||
.click({ force: true });
|
.click({ force: true });
|
||||||
} else {
|
} else {
|
||||||
cy.log('Unable to find any transactions on page');
|
cy.slack('Unable to find any transactions on page');
|
||||||
cy.screenshot();
|
cy.screenshot();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -78,7 +78,7 @@ context.skip('Transactions page', function () {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
cy.log('Unable to find any transactions on page');
|
cy.slack('Unable to find any transactions on page');
|
||||||
cy.screenshot();
|
cy.screenshot();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -7,11 +7,7 @@ context('Validator page', { tags: '@smoke' }, function () {
|
|||||||
it('should be able to see validator tiles', function () {
|
it('should be able to see validator tiles', function () {
|
||||||
cy.getNodes().then((nodes) => {
|
cy.getNodes().then((nodes) => {
|
||||||
nodes.forEach((node) => {
|
nodes.forEach((node) => {
|
||||||
if (node.rankingScore.performanceScore > 0) {
|
cy.get(`[validator-id="${node.id}"]`).should('be.visible');
|
||||||
cy.get(`[validator-id="${node.id}"]`).should('be.visible');
|
|
||||||
} else {
|
|
||||||
cy.get(`[validator-id="${node.id}"]`).should('not.exist');
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ Cypress.Commands.add('switchToMobile', () => {
|
|||||||
Cypress.Commands.add('common_switch_to_mobile_and_click_toggle', function () {
|
Cypress.Commands.add('common_switch_to_mobile_and_click_toggle', function () {
|
||||||
cy.viewport('iphone-x');
|
cy.viewport('iphone-x');
|
||||||
cy.visit('/');
|
cy.visit('/');
|
||||||
cy.get('[data-testid="button-menu-drawer"]').click();
|
cy.get('[data-testid="open-menu"]').click();
|
||||||
});
|
});
|
||||||
|
|
||||||
Cypress.Commands.add('monitor_clipboard', () => {
|
Cypress.Commands.add('monitor_clipboard', () => {
|
||||||
@@ -88,49 +88,3 @@ Cypress.Commands.add('convert_number_to_max_four_decimal', (number) => {
|
|||||||
maximumFractionDigits: 4,
|
maximumFractionDigits: 4,
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
Cypress.Commands.add('navigate_to', (page, mobileView = false) => {
|
|
||||||
const navigation = {
|
|
||||||
transactions: '/txs',
|
|
||||||
blocks: '/blocks',
|
|
||||||
oracles: '/oracles',
|
|
||||||
validators: '/validators',
|
|
||||||
parties: '/parties',
|
|
||||||
assets: '/assets',
|
|
||||||
markets: '/markets',
|
|
||||||
governanceProposals: '/governance',
|
|
||||||
networkParameters: '/network-parameters',
|
|
||||||
genesisParameters: '/genesis',
|
|
||||||
};
|
|
||||||
|
|
||||||
const topLevelRoutes = ['transactions', 'blocks', 'oracles', 'validators'];
|
|
||||||
|
|
||||||
cy.getByTestId('navigation').within(() => {
|
|
||||||
if (!topLevelRoutes.includes(page) && mobileView === false) {
|
|
||||||
cy.getByTestId('other').first().click();
|
|
||||||
}
|
|
||||||
cy.get(`[href="${navigation[page]}"]`).first().click();
|
|
||||||
});
|
|
||||||
cy.url().should('include', navigation[page]);
|
|
||||||
});
|
|
||||||
|
|
||||||
Cypress.Commands.add('get_element_by_col_id', (elementName) => {
|
|
||||||
cy.get(`[col-id="${elementName}"]`);
|
|
||||||
});
|
|
||||||
|
|
||||||
Cypress.Commands.add(
|
|
||||||
'validate_element_from_table',
|
|
||||||
(tableRowName, tableRowValue) => {
|
|
||||||
cy.contains(tableRowName)
|
|
||||||
.parentsUntil("[data-testid='key-value-table-row']")
|
|
||||||
.siblings()
|
|
||||||
.should('have.text', tableRowValue);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
Cypress.Commands.add(
|
|
||||||
'validate_proposal_change_type',
|
|
||||||
(tableRowName, changeType) => {
|
|
||||||
cy.contains(tableRowName).siblings().should('have.text', changeType);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|||||||
@@ -1,130 +0,0 @@
|
|||||||
export function createSuccessorMarketProposal(parentMarketId) {
|
|
||||||
cy.VegaWalletSubmitProposal(getSuccessorTxBody(parentMarketId));
|
|
||||||
}
|
|
||||||
|
|
||||||
function getSuccessorTxBody(parentMarketId) {
|
|
||||||
return {
|
|
||||||
proposalSubmission: {
|
|
||||||
rationale: {
|
|
||||||
title: 'Test successor market proposal details',
|
|
||||||
description: 'E2E test for successor market',
|
|
||||||
},
|
|
||||||
terms: {
|
|
||||||
newMarket: {
|
|
||||||
changes: {
|
|
||||||
decimalPlaces: '5',
|
|
||||||
positionDecimalPlaces: '5',
|
|
||||||
linearSlippageFactor: '0.001',
|
|
||||||
quadraticSlippageFactor: '0',
|
|
||||||
lpPriceRange: '10',
|
|
||||||
instrument: {
|
|
||||||
name: 'Token test market',
|
|
||||||
code: 'TEST.24h',
|
|
||||||
future: {
|
|
||||||
settlementAsset:
|
|
||||||
'816af99af60d684502a40824758f6b5377e6af48e50a9ee8ef478ecb879ea8bc',
|
|
||||||
quoteName: 'fUSDC',
|
|
||||||
dataSourceSpecForSettlementData: {
|
|
||||||
external: {
|
|
||||||
oracle: {
|
|
||||||
signers: [
|
|
||||||
{
|
|
||||||
pubKey: {
|
|
||||||
key: '70d14a321e02e71992fd115563df765000ccc4775cbe71a0e2f9ff5a3b9dc680',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
],
|
|
||||||
filters: [
|
|
||||||
{
|
|
||||||
key: {
|
|
||||||
name: 'prices.BTC.value',
|
|
||||||
type: 'TYPE_INTEGER',
|
|
||||||
numberDecimalPlaces: '0',
|
|
||||||
},
|
|
||||||
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_EQUALS',
|
|
||||||
value: 'true',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
dataSourceSpecBinding: {
|
|
||||||
settlementDataProperty: 'prices.BTC.value',
|
|
||||||
tradingTerminationProperty: 'trading.terminated.ETH5',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
metadata: [
|
|
||||||
'sector:food',
|
|
||||||
'sector:materials',
|
|
||||||
'source:docs.vega.xyz',
|
|
||||||
],
|
|
||||||
priceMonitoringParameters: {
|
|
||||||
triggers: [
|
|
||||||
{
|
|
||||||
horizon: '43200',
|
|
||||||
probability: '0.9999999',
|
|
||||||
auctionExtension: '600',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
liquidityMonitoringParameters: {
|
|
||||||
targetStakeParameters: {
|
|
||||||
timeWindow: '3600',
|
|
||||||
scalingFactor: 10,
|
|
||||||
},
|
|
||||||
triggeringRatio: '0.7',
|
|
||||||
auctionExtension: '1',
|
|
||||||
},
|
|
||||||
logNormal: {
|
|
||||||
tau: 0.0001140771161,
|
|
||||||
riskAversionParameter: 0.01,
|
|
||||||
params: {
|
|
||||||
mu: 0,
|
|
||||||
r: 0.016,
|
|
||||||
sigma: 0.5,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
successor: {
|
|
||||||
parentMarketId: parentMarketId,
|
|
||||||
insurancePoolFraction: '0.75',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
closingTimestamp: 1695666618,
|
|
||||||
enactmentTimestamp: 1695666618,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
};
|
|
||||||
}
|
|
||||||
@@ -4,7 +4,7 @@ NX_TENDERMINT_WEBSOCKET_URL=wss://be.mainnet-mirror.vega.rocks/websocket
|
|||||||
NX_SENTRY_DSN=https://4b8c8a8ba07742648aa4dfe1b8d17e40@o286262.ingest.sentry.io/5882996
|
NX_SENTRY_DSN=https://4b8c8a8ba07742648aa4dfe1b8d17e40@o286262.ingest.sentry.io/5882996
|
||||||
NX_VEGA_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/networks-internal/main/mainnet-mirror/vegawallet-mainnet-mirror.toml
|
NX_VEGA_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/networks-internal/main/mainnet-mirror/vegawallet-mainnet-mirror.toml
|
||||||
NX_VEGA_URL=https://api.mainnet-mirror.vega.rocks/graphql
|
NX_VEGA_URL=https://api.mainnet-mirror.vega.rocks/graphql
|
||||||
NX_VEGA_ENV=MAINNET_MIRROR
|
NX_VEGA_ENV=MAINNET-MIRROR
|
||||||
NX_BLOCK_EXPLORER=https://be.mainnet-mirror.vega.rocks/rest
|
NX_BLOCK_EXPLORER=https://be.mainnet-mirror.vega.rocks/rest
|
||||||
NX_ETHERSCAN_URL=https://sepolia.etherscan.io
|
NX_ETHERSCAN_URL=https://sepolia.etherscan.io
|
||||||
NX_VEGA_GOVERNANCE_URL=https://governance.mainnet-mirror.vega.rocks
|
NX_VEGA_GOVERNANCE_URL=https://governance.mainnet-mirror.vega.rocks
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ export const Footer = () => {
|
|||||||
);
|
);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<footer className="grid grid-cols-[1fr_auto] items-center text-xs md:text-md lg:flex md:col-span-2 px-4 pt-2 pb-3 gap-4 border-t border-vega-light-200 dark:border-vega-dark-200">
|
<footer className="grid grid-rows-2 lg:grid-cols-[1fr_auto] text-xs md:text-md lg:flex md:col-span-2 px-4 py-2 gap-4 border-t border-vega-light-200 dark:border-vega-dark-200">
|
||||||
<div className="flex justify-between gap-2 align-middle">
|
<div className="flex justify-between gap-2 align-middle">
|
||||||
{GIT_COMMIT_HASH && (
|
{GIT_COMMIT_HASH && (
|
||||||
<div className="content-center flex border-r border-neutral-700 dark:border-neutral-300 pr-4">
|
<div className="content-center flex border-r border-neutral-700 dark:border-neutral-300 pr-4">
|
||||||
@@ -43,12 +43,9 @@ export const Footer = () => {
|
|||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
<div className="content-center flex pr-4 md:border-r border-neutral-700 dark:border-neutral-300">
|
<div className="content-center flex pl-2 md:border-r border-neutral-700 dark:border-neutral-300 pr-4">
|
||||||
<span className="pr-2">{VEGA_URL && <NodeUrl url={VEGA_URL} />}</span>
|
{VEGA_URL && <NodeUrl url={VEGA_URL} />}
|
||||||
<Link
|
<Link className="ml-2" onClick={() => setNodeSwitcherOpen(true)}>
|
||||||
className="ml-2 underline-offset-4"
|
|
||||||
onClick={() => setNodeSwitcherOpen(true)}
|
|
||||||
>
|
|
||||||
{t('Change')}
|
{t('Change')}
|
||||||
</Link>
|
</Link>
|
||||||
</div>
|
</div>
|
||||||
@@ -62,10 +59,7 @@ export const Footer = () => {
|
|||||||
) : null}
|
) : null}
|
||||||
</div>
|
</div>
|
||||||
<div className="pl-2 align-center lg:align-right lg:flex lg:justify-end gap-2 align-middle lg:max-w-xs lg:ml-auto">
|
<div className="pl-2 align-center lg:align-right lg:flex lg:justify-end gap-2 align-middle lg:max-w-xs lg:ml-auto">
|
||||||
<RouteLink
|
<RouteLink to={`/${Routes.DISCLAIMER}`} className="underline">
|
||||||
to={`/${Routes.DISCLAIMER}`}
|
|
||||||
className="underline underline-offset-4"
|
|
||||||
>
|
|
||||||
Disclaimer
|
Disclaimer
|
||||||
</RouteLink>
|
</RouteLink>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -95,10 +95,7 @@ export const Header = () => {
|
|||||||
{mainItems.map(routeToNavigationItem)}
|
{mainItems.map(routeToNavigationItem)}
|
||||||
{groupedItems && groupedItems.length > 0 && (
|
{groupedItems && groupedItems.length > 0 && (
|
||||||
<NavigationItem>
|
<NavigationItem>
|
||||||
<NavigationTrigger
|
<NavigationTrigger isActive={Boolean(isOnOther)}>
|
||||||
isActive={Boolean(isOnOther)}
|
|
||||||
data-testid="other"
|
|
||||||
>
|
|
||||||
{t('Other')}
|
{t('Other')}
|
||||||
</NavigationTrigger>
|
</NavigationTrigger>
|
||||||
<NavigationContent>
|
<NavigationContent>
|
||||||
|
|||||||
@@ -1,9 +1,6 @@
|
|||||||
import { t } from '@vegaprotocol/i18n';
|
import { t } from '@vegaprotocol/i18n';
|
||||||
import type { MarketInfoWithData } from '@vegaprotocol/markets';
|
import type { MarketInfoWithData } from '@vegaprotocol/markets';
|
||||||
import {
|
import { PriceMonitoringBoundsInfoPanel } from '@vegaprotocol/markets';
|
||||||
PriceMonitoringBoundsInfoPanel,
|
|
||||||
SuccessionLineInfoPanel,
|
|
||||||
} from '@vegaprotocol/markets';
|
|
||||||
import {
|
import {
|
||||||
LiquidityInfoPanel,
|
LiquidityInfoPanel,
|
||||||
LiquidityMonitoringParametersInfoPanel,
|
LiquidityMonitoringParametersInfoPanel,
|
||||||
@@ -106,8 +103,6 @@ export const MarketDetails = ({ market }: { market: MarketInfoWithData }) => {
|
|||||||
<OracleInfoPanel market={market} type="settlementData" />
|
<OracleInfoPanel market={market} type="settlementData" />
|
||||||
</>
|
</>
|
||||||
)}
|
)}
|
||||||
<h2 className={`${headerClassName} mb-4`}>{t('Succession line')}</h2>
|
|
||||||
<SuccessionLineInfoPanel market={market} />
|
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -137,7 +137,7 @@ export const ProposalsTable = ({ data }: ProposalsTableProps) => {
|
|||||||
hide: window.innerWidth <= BREAKPOINT_MD,
|
hide: window.innerWidth <= BREAKPOINT_MD,
|
||||||
headerName: t('Enactment date'),
|
headerName: t('Enactment date'),
|
||||||
field: 'terms.enactmentDatetime',
|
field: 'terms.enactmentDatetime',
|
||||||
valueFormatter: ({
|
valueFormatte: ({
|
||||||
value,
|
value,
|
||||||
}: VegaValueFormatterParams<
|
}: VegaValueFormatterParams<
|
||||||
ProposalListFieldsFragment,
|
ProposalListFieldsFragment,
|
||||||
|
|||||||
@@ -1,52 +0,0 @@
|
|||||||
import { t } from '@vegaprotocol/i18n';
|
|
||||||
import type { components } from '../../../../../types/explorer';
|
|
||||||
import { Tooltip } from '@vegaprotocol/ui-toolkit';
|
|
||||||
|
|
||||||
export interface TxDetailsOrderIcebergDetailsProps {
|
|
||||||
iceberg: components['schemas']['v1IcebergOpts'];
|
|
||||||
size: components['schemas']['v1OrderSubmission']['size'];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
|
|
||||||
.iceberg .sub {
|
|
||||||
vertical-align: bottom;
|
|
||||||
color: #954F01;
|
|
||||||
}
|
|
||||||
|
|
||||||
.iceberg .sup {
|
|
||||||
vertical-align: top;
|
|
||||||
color: #515E1E;
|
|
||||||
}
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Visualises the iceberg details of an order, showing the minimum visible size,
|
|
||||||
* the full size and the peak size.
|
|
||||||
*/
|
|
||||||
export const TxOrderIcebergDetails = ({
|
|
||||||
iceberg,
|
|
||||||
size,
|
|
||||||
}: TxDetailsOrderIcebergDetailsProps) => {
|
|
||||||
return (
|
|
||||||
<div
|
|
||||||
className="inline-block iceberg bg-vega-blue-300 border-vega-blue-350 border-[1px] text-[70%] font-mono py-[2px] pl-2 pr-3 height-[1em] leading-[1em] cursor-pointer"
|
|
||||||
style={{ clipPath: 'polygon(10% 0%, 100% 0%, 90% 100%, 0% 100%)' }}
|
|
||||||
>
|
|
||||||
<Tooltip description={t('Iceberg: Minimum visible size')}>
|
|
||||||
<span className="align-bottom text-vega-orange-650">
|
|
||||||
{iceberg.minimumVisibleSize || '-'}
|
|
||||||
</span>
|
|
||||||
</Tooltip>
|
|
||||||
<Tooltip description={t('Iceberg: Total size')}>
|
|
||||||
<span className="text-sm text-vega-blue-600 mx-3">{size}</span>
|
|
||||||
</Tooltip>
|
|
||||||
<Tooltip description={t('Iceberg: Visible peak')}>
|
|
||||||
<span className="align-top text-vega-yellow-600">
|
|
||||||
{iceberg.peakSize || '-'}
|
|
||||||
</span>
|
|
||||||
</Tooltip>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
@@ -8,7 +8,6 @@ import { txSignatureToDeterministicId } from '../lib/deterministic-ids';
|
|||||||
import DeterministicOrderDetails from '../../order-details/deterministic-order-details';
|
import DeterministicOrderDetails from '../../order-details/deterministic-order-details';
|
||||||
import Hash from '../../links/hash';
|
import Hash from '../../links/hash';
|
||||||
import { TxOrderPeggedReferenceRow } from './order/tx-order-peg';
|
import { TxOrderPeggedReferenceRow } from './order/tx-order-peg';
|
||||||
import { TxOrderIcebergDetails } from './order/tx-order-iceberg';
|
|
||||||
|
|
||||||
interface TxDetailsOrderProps {
|
interface TxDetailsOrderProps {
|
||||||
txData: BlockExplorerTransactionResult | undefined;
|
txData: BlockExplorerTransactionResult | undefined;
|
||||||
@@ -33,8 +32,6 @@ export const TxDetailsOrder = ({
|
|||||||
const marketId = txData.command.orderSubmission.marketId || '-';
|
const marketId = txData.command.orderSubmission.marketId || '-';
|
||||||
const reference = txData.command.orderSubmission.peggedOrder;
|
const reference = txData.command.orderSubmission.peggedOrder;
|
||||||
const side = txData.command.orderSubmission.side;
|
const side = txData.command.orderSubmission.side;
|
||||||
const iceberg = txData.command.orderSubmission.icebergOpts;
|
|
||||||
const size = txData.command.orderSubmission.size;
|
|
||||||
|
|
||||||
let deterministicId = '';
|
let deterministicId = '';
|
||||||
|
|
||||||
@@ -77,14 +74,6 @@ export const TxDetailsOrder = ({
|
|||||||
marketId={marketId}
|
marketId={marketId}
|
||||||
/>
|
/>
|
||||||
) : null}
|
) : null}
|
||||||
{iceberg ? (
|
|
||||||
<TableRow modifier="bordered">
|
|
||||||
<TableCell>{t('Iceberg details')}</TableCell>
|
|
||||||
<TableCell>
|
|
||||||
<TxOrderIcebergDetails iceberg={iceberg} size={size} />
|
|
||||||
</TableCell>
|
|
||||||
</TableRow>
|
|
||||||
) : null}
|
|
||||||
</TableWithTbody>
|
</TableWithTbody>
|
||||||
|
|
||||||
{deterministicId.length > 0 ? (
|
{deterministicId.length > 0 ? (
|
||||||
|
|||||||
@@ -10,8 +10,6 @@ import Hash from '../../links/hash';
|
|||||||
import { t } from '@vegaprotocol/i18n';
|
import { t } from '@vegaprotocol/i18n';
|
||||||
import { ProposalSignatureBundleNewAsset } from './proposal/signature-bundle-new';
|
import { ProposalSignatureBundleNewAsset } from './proposal/signature-bundle-new';
|
||||||
import { ProposalSignatureBundleUpdateAsset } from './proposal/signature-bundle-update';
|
import { ProposalSignatureBundleUpdateAsset } from './proposal/signature-bundle-update';
|
||||||
import { MarketLink } from '../../links';
|
|
||||||
import { formatNumber } from '@vegaprotocol/utils';
|
|
||||||
|
|
||||||
export type Proposal = components['schemas']['v1ProposalSubmission'];
|
export type Proposal = components['schemas']['v1ProposalSubmission'];
|
||||||
export type ProposalTerms = components['schemas']['vegaProposalTerms'];
|
export type ProposalTerms = components['schemas']['vegaProposalTerms'];
|
||||||
@@ -55,11 +53,7 @@ export function proposalTypeLabel(terms?: ProposalTerms): string {
|
|||||||
} else if (has(terms, 'updateAsset')) {
|
} else if (has(terms, 'updateAsset')) {
|
||||||
return t('Update asset proposal');
|
return t('Update asset proposal');
|
||||||
} else if (has(terms, 'newMarket')) {
|
} else if (has(terms, 'newMarket')) {
|
||||||
if (terms?.newMarket?.changes?.successor) {
|
return t('New market proposal');
|
||||||
return t('Successor market proposal');
|
|
||||||
} else {
|
|
||||||
return t('New market proposal');
|
|
||||||
}
|
|
||||||
} else if (has(terms, 'updateMarket')) {
|
} else if (has(terms, 'updateMarket')) {
|
||||||
return t('Update market proposal');
|
return t('Update market proposal');
|
||||||
} else if (has(terms, 'updateNetworkParameter')) {
|
} else if (has(terms, 'updateNetworkParameter')) {
|
||||||
@@ -91,13 +85,6 @@ export const TxProposal = ({ txData, pubKey, blockData }: TxProposalProps) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const tx = proposal.terms?.newAsset || proposal.terms?.updateAsset;
|
const tx = proposal.terms?.newAsset || proposal.terms?.updateAsset;
|
||||||
const isSuccessorMarketProposal =
|
|
||||||
proposal?.terms?.newMarket?.changes?.successor;
|
|
||||||
const parentMarketId =
|
|
||||||
isSuccessorMarketProposal &&
|
|
||||||
proposal?.terms.newMarket?.changes?.successor?.parentMarketId;
|
|
||||||
const insurancePoolFraction =
|
|
||||||
proposal?.terms?.newMarket?.changes?.successor?.insurancePoolFraction;
|
|
||||||
|
|
||||||
// This component is not rendered if no bundle is required
|
// This component is not rendered if no bundle is required
|
||||||
const SignatureBundleComponent = proposal.terms?.newAsset
|
const SignatureBundleComponent = proposal.terms?.newAsset
|
||||||
@@ -124,30 +111,6 @@ export const TxProposal = ({ txData, pubKey, blockData }: TxProposalProps) => {
|
|||||||
<Hash text={deterministicId} />
|
<Hash text={deterministicId} />
|
||||||
</TableCell>
|
</TableCell>
|
||||||
</TableRow>
|
</TableRow>
|
||||||
{isSuccessorMarketProposal ? (
|
|
||||||
<>
|
|
||||||
{parentMarketId ? (
|
|
||||||
<TableRow modifier="bordered">
|
|
||||||
<TableCell>{t('Previous market')}</TableCell>
|
|
||||||
<TableCell>
|
|
||||||
<MarketLink
|
|
||||||
id={
|
|
||||||
proposal.terms?.newMarket.changes.successor.parentMarketId
|
|
||||||
}
|
|
||||||
/>
|
|
||||||
</TableCell>
|
|
||||||
</TableRow>
|
|
||||||
) : null}
|
|
||||||
{insurancePoolFraction ? (
|
|
||||||
<TableRow modifier="bordered">
|
|
||||||
<TableCell>{t('Insurance pool fraction')}</TableCell>
|
|
||||||
<TableCell>
|
|
||||||
{formatNumber(Number(insurancePoolFraction) * 100, 0)}%
|
|
||||||
</TableCell>
|
|
||||||
</TableRow>
|
|
||||||
) : null}
|
|
||||||
</>
|
|
||||||
) : null}
|
|
||||||
</TableWithTbody>
|
</TableWithTbody>
|
||||||
<ProposalSummary
|
<ProposalSummary
|
||||||
id={deterministicId}
|
id={deterministicId}
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import {
|
|||||||
DropdownMenuTrigger,
|
DropdownMenuTrigger,
|
||||||
DropdownMenuSubContent,
|
DropdownMenuSubContent,
|
||||||
Icon,
|
Icon,
|
||||||
|
Button,
|
||||||
} from '@vegaprotocol/ui-toolkit';
|
} from '@vegaprotocol/ui-toolkit';
|
||||||
import type { Dispatch, SetStateAction } from 'react';
|
import type { Dispatch, SetStateAction } from 'react';
|
||||||
import { FilterLabel } from './tx-filter-label';
|
import { FilterLabel } from './tx-filter-label';
|
||||||
@@ -99,13 +100,15 @@ export const TxsFilter = ({ filters, setFilters }: TxFilterProps) => {
|
|||||||
<DropdownMenu
|
<DropdownMenu
|
||||||
modal={false}
|
modal={false}
|
||||||
trigger={
|
trigger={
|
||||||
<DropdownMenuTrigger>
|
<DropdownMenuTrigger className="ml-0">
|
||||||
<FilterLabel filters={filters} />
|
<Button size="xs" data-testid="filter-trigger">
|
||||||
|
<FilterLabel filters={filters} />
|
||||||
|
</Button>
|
||||||
</DropdownMenuTrigger>
|
</DropdownMenuTrigger>
|
||||||
}
|
}
|
||||||
>
|
>
|
||||||
<DropdownMenuContent>
|
<DropdownMenuContent>
|
||||||
{filters.size > 1 ? null : (
|
{filters.size > 0 ? null : (
|
||||||
<>
|
<>
|
||||||
<DropdownMenuCheckboxItem
|
<DropdownMenuCheckboxItem
|
||||||
onCheckedChange={() => setFilters(new Set(AllFilterOptions))}
|
onCheckedChange={() => setFilters(new Set(AllFilterOptions))}
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ export const TxsListNavigation = ({
|
|||||||
</Button>
|
</Button>
|
||||||
<Button
|
<Button
|
||||||
size="xs"
|
size="xs"
|
||||||
disabled={!hasMoreTxs}
|
disabled={!hasMoreTxs || loading}
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
nextPage();
|
nextPage();
|
||||||
}}
|
}}
|
||||||
|
|||||||
@@ -78,11 +78,7 @@ export function getLabelForProposal(
|
|||||||
} else if (proposal.terms?.updateAsset) {
|
} else if (proposal.terms?.updateAsset) {
|
||||||
return t('Proposal: Update asset');
|
return t('Proposal: Update asset');
|
||||||
} else if (proposal.terms?.newMarket) {
|
} else if (proposal.terms?.newMarket) {
|
||||||
if (proposal.terms?.newMarket.changes?.successor) {
|
return t('Proposal: New market');
|
||||||
return t('Proposal: Successor market');
|
|
||||||
} else {
|
|
||||||
return t('Proposal: New market');
|
|
||||||
}
|
|
||||||
} else if (proposal.terms?.updateMarket) {
|
} else if (proposal.terms?.updateMarket) {
|
||||||
return t('Proposal: Update market');
|
return t('Proposal: Update market');
|
||||||
} else if (proposal.terms?.updateNetworkParameter) {
|
} else if (proposal.terms?.updateNetworkParameter) {
|
||||||
@@ -170,7 +166,6 @@ export const TxOrderType = ({ orderType, command }: TxOrderTypeProps) => {
|
|||||||
'text-white dark:text-white bg-vega-dark-150 dark:bg-vega-dark-250';
|
'text-white dark:text-white bg-vega-dark-150 dark:bg-vega-dark-250';
|
||||||
|
|
||||||
// This will get unwieldy and should probably produce a different colour of tag
|
// This will get unwieldy and should probably produce a different colour of tag
|
||||||
// Note that colours are currently arbitrary
|
|
||||||
if (type === 'Chain Event' && !!command?.chainEvent) {
|
if (type === 'Chain Event' && !!command?.chainEvent) {
|
||||||
type = getLabelForChainEvent(command.chainEvent);
|
type = getLabelForChainEvent(command.chainEvent);
|
||||||
colours = 'text-white dark-text-white bg-vega-pink dark:bg-vega-pink';
|
colours = 'text-white dark-text-white bg-vega-pink dark:bg-vega-pink';
|
||||||
@@ -182,9 +177,6 @@ export const TxOrderType = ({ orderType, command }: TxOrderTypeProps) => {
|
|||||||
type = getLabelForProposal(command.proposalSubmission);
|
type = getLabelForProposal(command.proposalSubmission);
|
||||||
}
|
}
|
||||||
colours = 'text-black bg-vega-yellow';
|
colours = 'text-black bg-vega-yellow';
|
||||||
} else if (type === 'Order' && command) {
|
|
||||||
type = getLabelForOrderType(orderType, command);
|
|
||||||
colours = 'text-white dark-text-white bg-vega-blue dark:bg-vega-blue';
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (type === 'Vote on Proposal') {
|
if (type === 'Vote on Proposal') {
|
||||||
|
|||||||
@@ -86,18 +86,14 @@ describe('Txs infinite list item', () => {
|
|||||||
render(
|
render(
|
||||||
<MockedProvider>
|
<MockedProvider>
|
||||||
<MemoryRouter>
|
<MemoryRouter>
|
||||||
<table>
|
<TxsInfiniteListItem
|
||||||
<tbody>
|
type="testType"
|
||||||
<TxsInfiniteListItem
|
submitter="testPubKey"
|
||||||
type="testType"
|
hash="testTxHash"
|
||||||
submitter="testPubKey"
|
block="1"
|
||||||
hash="testTxHash"
|
code={0}
|
||||||
block="1"
|
command={{}}
|
||||||
code={0}
|
/>
|
||||||
command={{}}
|
|
||||||
/>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</MemoryRouter>
|
</MemoryRouter>
|
||||||
</MockedProvider>
|
</MockedProvider>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -14,9 +14,9 @@ const DEFAULT_TRUNCATE_LENGTH = 7;
|
|||||||
|
|
||||||
export function getIdTruncateLength(screen: Screen): number {
|
export function getIdTruncateLength(screen: Screen): number {
|
||||||
if (['xxxl', 'xxl'].includes(screen)) {
|
if (['xxxl', 'xxl'].includes(screen)) {
|
||||||
return 32;
|
return 64;
|
||||||
} else if (['xl', 'lg', 'md'].includes(screen)) {
|
} else if (['xl', 'lg', 'md'].includes(screen)) {
|
||||||
return 16;
|
return 32;
|
||||||
}
|
}
|
||||||
return DEFAULT_TRUNCATE_LENGTH;
|
return DEFAULT_TRUNCATE_LENGTH;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,17 +5,11 @@ import type { BlockExplorerTransactionResult } from '../../routes/types/block-ex
|
|||||||
import { Side } from '@vegaprotocol/types';
|
import { Side } from '@vegaprotocol/types';
|
||||||
import { MockedProvider } from '@apollo/client/testing';
|
import { MockedProvider } from '@apollo/client/testing';
|
||||||
|
|
||||||
const generateHash = (): string =>
|
|
||||||
Array.from(
|
|
||||||
{ length: 64 },
|
|
||||||
() => '0123456789ABCDEF'[Math.floor(Math.random() * 16)]
|
|
||||||
).join('');
|
|
||||||
|
|
||||||
const generateTxs = (number: number): BlockExplorerTransactionResult[] => {
|
const generateTxs = (number: number): BlockExplorerTransactionResult[] => {
|
||||||
return Array.from(Array(number)).map((_) => ({
|
return Array.from(Array(number)).map((_) => ({
|
||||||
block: '87901',
|
block: '87901',
|
||||||
index: 2,
|
index: 2,
|
||||||
hash: generateHash(),
|
hash: '0F8B98DA0923A50786B852D9CA11E051CACC4C733E1DB93D535C7D81DBD10F6F',
|
||||||
submitter:
|
submitter:
|
||||||
'4b782482f587d291e8614219eb9a5ee9280fa2c58982dee71d976782a9be1964',
|
'4b782482f587d291e8614219eb9a5ee9280fa2c58982dee71d976782a9be1964',
|
||||||
type: 'Submit Order',
|
type: 'Submit Order',
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import { Table, TableRow } from '../table';
|
|||||||
import { t } from '@vegaprotocol/i18n';
|
import { t } from '@vegaprotocol/i18n';
|
||||||
import { useFetch } from '@vegaprotocol/react-helpers';
|
import { useFetch } from '@vegaprotocol/react-helpers';
|
||||||
import type { BlockExplorerTransactions } from '../../routes/types/block-explorer-response';
|
import type { BlockExplorerTransactions } from '../../routes/types/block-explorer-response';
|
||||||
import { getTxsDataUrl } from '../../hooks/get-txs-data-url';
|
import { getTxsDataUrl } from '../../hooks/use-txs-data';
|
||||||
import { AsyncRenderer, Loader } from '@vegaprotocol/ui-toolkit';
|
import { AsyncRenderer, Loader } from '@vegaprotocol/ui-toolkit';
|
||||||
import EmptyList from '../empty-list/empty-list';
|
import EmptyList from '../empty-list/empty-list';
|
||||||
import { TxsInfiniteListItem } from './txs-infinite-list-item';
|
import { TxsInfiniteListItem } from './txs-infinite-list-item';
|
||||||
@@ -14,7 +14,7 @@ interface TxsPerBlockProps {
|
|||||||
|
|
||||||
export const TxsPerBlock = ({ blockHeight, txCount }: TxsPerBlockProps) => {
|
export const TxsPerBlock = ({ blockHeight, txCount }: TxsPerBlockProps) => {
|
||||||
const filters = `filters[block.height]=${blockHeight}`;
|
const filters = `filters[block.height]=${blockHeight}`;
|
||||||
const url = getTxsDataUrl({ filters, count: txCount });
|
const url = getTxsDataUrl({ limit: txCount.toString(), filters });
|
||||||
const {
|
const {
|
||||||
state: { data, loading, error },
|
state: { data, loading, error },
|
||||||
} = useFetch<BlockExplorerTransactions>(url);
|
} = useFetch<BlockExplorerTransactions>(url);
|
||||||
|
|||||||
@@ -5,6 +5,8 @@ const windowOrDefault = (key: string) => {
|
|||||||
return (process.env[key] as string) || '';
|
return (process.env[key] as string) || '';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const truthy = ['1', 'true'];
|
||||||
|
|
||||||
export const ENV = {
|
export const ENV = {
|
||||||
// Data sources
|
// Data sources
|
||||||
// Environment
|
// Environment
|
||||||
@@ -18,6 +20,19 @@ export const ENV = {
|
|||||||
governanceUrl: windowOrDefault('NX_VEGA_GOVERNANCE_URL'),
|
governanceUrl: windowOrDefault('NX_VEGA_GOVERNANCE_URL'),
|
||||||
vegaRepoUrl: windowOrDefault('NX_VEGA_REPO_URL'),
|
vegaRepoUrl: windowOrDefault('NX_VEGA_REPO_URL'),
|
||||||
},
|
},
|
||||||
|
flags: {
|
||||||
|
assets: truthy.includes(windowOrDefault('NX_EXPLORER_ASSETS')),
|
||||||
|
genesis: truthy.includes(windowOrDefault('NX_EXPLORER_GENESIS')),
|
||||||
|
governance: truthy.includes(windowOrDefault('NX_EXPLORER_GOVERNANCE')),
|
||||||
|
markets: truthy.includes(windowOrDefault('NX_EXPLORER_MARKETS')),
|
||||||
|
oracles: truthy.includes(windowOrDefault('NX_EXPLORER_ORACLES')),
|
||||||
|
txsList: truthy.includes(windowOrDefault('NX_EXPLORER_TXS_LIST')),
|
||||||
|
networkParameters: truthy.includes(
|
||||||
|
windowOrDefault('NX_EXPLORER_NETWORK_PARAMETERS')
|
||||||
|
),
|
||||||
|
parties: truthy.includes(windowOrDefault('NX_EXPLORER_PARTIES')),
|
||||||
|
validators: truthy.includes(windowOrDefault('NX_EXPLORER_VALIDATORS')),
|
||||||
|
},
|
||||||
addresses: {
|
addresses: {
|
||||||
feedback: windowOrDefault('NX_GITHUB_FEEDBACK_URL'),
|
feedback: windowOrDefault('NX_GITHUB_FEEDBACK_URL'),
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -0,0 +1,5 @@
|
|||||||
|
import { ENV } from './env';
|
||||||
|
|
||||||
|
export default {
|
||||||
|
...ENV.flags,
|
||||||
|
};
|
||||||
@@ -1,59 +0,0 @@
|
|||||||
import { DATA_SOURCES } from '../config';
|
|
||||||
|
|
||||||
type IGetTxsDataFirstPage = {
|
|
||||||
baseUrl?: string;
|
|
||||||
count?: number;
|
|
||||||
party?: string;
|
|
||||||
filters?: string;
|
|
||||||
};
|
|
||||||
|
|
||||||
interface IGetTxsDataPrevious extends IGetTxsDataFirstPage {
|
|
||||||
before: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
interface IGetTxsDataNext extends IGetTxsDataFirstPage {
|
|
||||||
after: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
type IGetTxsDataUrl =
|
|
||||||
| IGetTxsDataPrevious
|
|
||||||
| IGetTxsDataNext
|
|
||||||
| IGetTxsDataFirstPage;
|
|
||||||
|
|
||||||
export const BE_TXS_PER_REQUEST = 25;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Properly encodes the filters and parameters for a request to the block explorer
|
|
||||||
* API for transactions. As the API uses a slightly less common format for encoding
|
|
||||||
* filters, some of it is more manual than you might expect.
|
|
||||||
*
|
|
||||||
* @param params An object containing the pagination and filters
|
|
||||||
* @returns string URL to call
|
|
||||||
*/
|
|
||||||
export const getTxsDataUrl = (params: IGetTxsDataUrl) => {
|
|
||||||
const baseUrl =
|
|
||||||
params.baseUrl || `${DATA_SOURCES.blockExplorerUrl}/transactions`;
|
|
||||||
const url = new URL(baseUrl);
|
|
||||||
const count = `${params.count || BE_TXS_PER_REQUEST}`;
|
|
||||||
|
|
||||||
if ('before' in params && params.before?.length > 0) {
|
|
||||||
url.searchParams.append('last', count);
|
|
||||||
url.searchParams.append('before', params.before);
|
|
||||||
} else if ('after' in params && params.after?.length > 0) {
|
|
||||||
url.searchParams.append('first', count);
|
|
||||||
url.searchParams.append('after', params.after);
|
|
||||||
} else {
|
|
||||||
url.searchParams.append('first', count);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Hacky fix for param as array
|
|
||||||
let urlAsString = url.toString();
|
|
||||||
if (params.filters && params.filters?.length > 0) {
|
|
||||||
urlAsString += '&' + params.filters.replaceAll(' ', '%20');
|
|
||||||
}
|
|
||||||
if (params.party && params.party?.length > 0) {
|
|
||||||
urlAsString += `&filters[tx.submitter]=${params.party}`;
|
|
||||||
}
|
|
||||||
|
|
||||||
return urlAsString;
|
|
||||||
};
|
|
||||||
@@ -1,48 +0,0 @@
|
|||||||
import { getTxsDataUrl } from './get-txs-data-url'; // import the function to be tested
|
|
||||||
|
|
||||||
describe('getTxsDataUrl', () => {
|
|
||||||
it('should return the correct URL without filters and party', () => {
|
|
||||||
const params = {
|
|
||||||
count: 10,
|
|
||||||
baseUrl: 'https://example.com/transactions',
|
|
||||||
};
|
|
||||||
const expectedUrl = 'https://example.com/transactions?first=10';
|
|
||||||
|
|
||||||
expect(getTxsDataUrl(params)).toEqual(expectedUrl);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should return the correct URL with "before" in params', () => {
|
|
||||||
const params = {
|
|
||||||
count: 5,
|
|
||||||
before: '100.1',
|
|
||||||
baseUrl: 'https://example.com/transactions',
|
|
||||||
};
|
|
||||||
const expectedUrl = 'https://example.com/transactions?last=5&before=100.1';
|
|
||||||
|
|
||||||
expect(getTxsDataUrl(params)).toEqual(expectedUrl);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should return the correct URL with "after" in params', () => {
|
|
||||||
const params = {
|
|
||||||
count: 5,
|
|
||||||
after: '222.1',
|
|
||||||
baseUrl: 'https://example.com/transactions',
|
|
||||||
};
|
|
||||||
const expectedUrl = 'https://example.com/transactions?first=5&after=222.1';
|
|
||||||
|
|
||||||
expect(getTxsDataUrl(params)).toEqual(expectedUrl);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should return the correct URL with filters and party', () => {
|
|
||||||
const params = {
|
|
||||||
count: 10,
|
|
||||||
filters: 'filters[cmd.type]=Made Up Transaction',
|
|
||||||
party: '1234',
|
|
||||||
baseUrl: 'https://example.com/transactions',
|
|
||||||
};
|
|
||||||
const expectedUrl =
|
|
||||||
'https://example.com/transactions?first=10&filters[cmd.type]=Made%20Up%20Transaction&filters[tx.submitter]=1234';
|
|
||||||
|
|
||||||
expect(getTxsDataUrl(params)).toEqual(expectedUrl);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
@@ -1,141 +1,130 @@
|
|||||||
import { useSearchParams } from 'react-router-dom';
|
import { useCallback, useEffect, useState } from 'react';
|
||||||
import type { URLSearchParamsInit } from 'react-router-dom';
|
|
||||||
import { useCallback } from 'react';
|
|
||||||
import { useFetch } from '@vegaprotocol/react-helpers';
|
import { useFetch } from '@vegaprotocol/react-helpers';
|
||||||
import type {
|
import type {
|
||||||
BlockExplorerTransactionResult,
|
BlockExplorerTransactionResult,
|
||||||
BlockExplorerTransactions,
|
BlockExplorerTransactions,
|
||||||
} from '../routes/types/block-explorer-response';
|
} from '../routes/types/block-explorer-response';
|
||||||
|
import { DATA_SOURCES } from '../config';
|
||||||
import isNumber from 'lodash/isNumber';
|
import isNumber from 'lodash/isNumber';
|
||||||
import { AllFilterOptions } from '../components/txs/tx-filter';
|
|
||||||
import type { FilterOption } from '../components/txs/tx-filter';
|
|
||||||
import { BE_TXS_PER_REQUEST, getTxsDataUrl } from './get-txs-data-url';
|
|
||||||
|
|
||||||
export function getTypeFilters(filters?: Set<FilterOption>) {
|
export interface TxsStateProps {
|
||||||
if (!filters) {
|
txsData: BlockExplorerTransactionResult[];
|
||||||
return '';
|
hasMoreTxs: boolean;
|
||||||
} else if (filters.size > 1) {
|
cursor: string;
|
||||||
return '';
|
previousCursors: string[];
|
||||||
}
|
hasPreviousPage: boolean;
|
||||||
|
|
||||||
const forcedSingleFilter = Array.from(filters)[0];
|
|
||||||
return `filters[cmd.type]=${forcedSingleFilter}`;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface IUseTxsData {
|
export interface IUseTxsData {
|
||||||
count?: number;
|
limit: number;
|
||||||
before?: string;
|
filters?: string;
|
||||||
after?: string;
|
|
||||||
party?: string;
|
|
||||||
filters?: Set<FilterOption>;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export const useTxsData = ({
|
interface IGetTxsDataUrl {
|
||||||
count = 25,
|
limit: string;
|
||||||
before,
|
filters?: string;
|
||||||
after,
|
}
|
||||||
filters,
|
|
||||||
party,
|
|
||||||
}: IUseTxsData) => {
|
|
||||||
const [, setSearchParams] = useSearchParams();
|
|
||||||
let hasMoreTxs = true;
|
|
||||||
let txsData: BlockExplorerTransactionResult[] = [];
|
|
||||||
|
|
||||||
const url = getTxsDataUrl({
|
export const getTxsDataUrl = ({ limit, filters }: IGetTxsDataUrl) => {
|
||||||
filters: getTypeFilters(filters),
|
const url = new URL(`${DATA_SOURCES.blockExplorerUrl}/transactions`);
|
||||||
count,
|
|
||||||
before,
|
if (limit) {
|
||||||
after,
|
url.searchParams.append('limit', limit);
|
||||||
party,
|
}
|
||||||
|
|
||||||
|
// Hacky fix for param as array
|
||||||
|
let urlAsString = url.toString();
|
||||||
|
if (filters) {
|
||||||
|
urlAsString += '&' + filters.replace(' ', '%20');
|
||||||
|
}
|
||||||
|
|
||||||
|
return urlAsString;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const useTxsData = ({ limit, filters }: IUseTxsData) => {
|
||||||
|
const [
|
||||||
|
{ txsData, hasMoreTxs, cursor, previousCursors, hasPreviousPage },
|
||||||
|
setTxsState,
|
||||||
|
] = useState<TxsStateProps>({
|
||||||
|
txsData: [],
|
||||||
|
hasMoreTxs: false,
|
||||||
|
previousCursors: [],
|
||||||
|
cursor: '',
|
||||||
|
hasPreviousPage: false,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const url = getTxsDataUrl({ limit: limit.toString(), filters });
|
||||||
|
|
||||||
const {
|
const {
|
||||||
state: { data, error, loading },
|
state: { data, error, loading },
|
||||||
refetch,
|
refetch,
|
||||||
} = useFetch<BlockExplorerTransactions>(url, {}, true);
|
} = useFetch<BlockExplorerTransactions>(url, {}, true);
|
||||||
|
|
||||||
if (!loading && data && isNumber(data.transactions.length)) {
|
useEffect(() => {
|
||||||
hasMoreTxs = data.transactions.length >= count;
|
if (!loading && data && isNumber(data.transactions.length)) {
|
||||||
txsData = data.transactions;
|
setTxsState((prev) => {
|
||||||
}
|
return {
|
||||||
|
...prev,
|
||||||
|
txsData: data.transactions,
|
||||||
|
hasMoreTxs: data.transactions.length >= limit,
|
||||||
|
cursor: data?.transactions.at(-1)?.cursor || '',
|
||||||
|
};
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}, [loading, setTxsState, data, limit]);
|
||||||
|
|
||||||
const nextPage = useCallback(() => {
|
const nextPage = useCallback(() => {
|
||||||
const after = data?.transactions.at(-1)?.cursor || '';
|
const c = data?.transactions.at(0)?.cursor;
|
||||||
const params: URLSearchParamsInit = { after };
|
const newPreviousCursors = c ? [...previousCursors, c] : previousCursors;
|
||||||
if (filters) {
|
|
||||||
params.filters = Array.from(filters).join(',');
|
setTxsState((prev) => ({
|
||||||
}
|
...prev,
|
||||||
setSearchParams(params);
|
hasPreviousPage: true,
|
||||||
}, [filters, data, setSearchParams]);
|
previousCursors: newPreviousCursors,
|
||||||
|
}));
|
||||||
|
|
||||||
|
return refetch({
|
||||||
|
limit,
|
||||||
|
before: cursor,
|
||||||
|
});
|
||||||
|
}, [data, previousCursors, cursor, limit, refetch]);
|
||||||
|
|
||||||
const previousPage = useCallback(() => {
|
const previousPage = useCallback(() => {
|
||||||
const before = data?.transactions[0]?.cursor || '';
|
const previousCursor = [...previousCursors].pop();
|
||||||
const params: URLSearchParamsInit = { before };
|
const newPreviousCursors = previousCursors.slice(0, -1);
|
||||||
if (filters && filters.size > 0 && filters.size === 1) {
|
setTxsState((prev) => ({
|
||||||
params.filters = Array.from(filters)[0];
|
...prev,
|
||||||
}
|
hasPreviousPage: newPreviousCursors.length > 0,
|
||||||
setSearchParams(params);
|
previousCursors: newPreviousCursors,
|
||||||
}, [filters, data, setSearchParams]);
|
}));
|
||||||
|
return refetch({
|
||||||
|
limit,
|
||||||
|
before: previousCursor,
|
||||||
|
});
|
||||||
|
}, [previousCursors, limit, refetch]);
|
||||||
|
|
||||||
const refreshTxs = useCallback(async () => {
|
const refreshTxs = useCallback(async () => {
|
||||||
const params: URLSearchParamsInit = {};
|
setTxsState(() => ({
|
||||||
if (filters && filters.size > 0 && filters.size === 1) {
|
txsData: [],
|
||||||
params.filters = Array.from(filters)[0];
|
cursor: '',
|
||||||
}
|
previousCursors: [],
|
||||||
setSearchParams(params);
|
hasMoreTxs: false,
|
||||||
|
hasPreviousPage: false,
|
||||||
|
}));
|
||||||
|
|
||||||
refetch({ count: BE_TXS_PER_REQUEST });
|
refetch({ limit });
|
||||||
}, [setSearchParams, refetch, filters]);
|
}, [setTxsState, limit, refetch, filters]); // eslint-disable-line react-hooks/exhaustive-deps
|
||||||
|
|
||||||
const updateFilters = useCallback(
|
|
||||||
(newFilters: Set<FilterOption>) => {
|
|
||||||
const params: URLSearchParamsInit = {};
|
|
||||||
if (newFilters && newFilters.size === 1) {
|
|
||||||
params.filters = Array.from(newFilters)[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
setSearchParams(params);
|
|
||||||
},
|
|
||||||
[setSearchParams]
|
|
||||||
);
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
updateFilters,
|
|
||||||
txsData,
|
txsData,
|
||||||
loading,
|
loading,
|
||||||
error,
|
error,
|
||||||
hasMoreTxs,
|
hasMoreTxs,
|
||||||
|
hasPreviousPage,
|
||||||
|
previousCursors,
|
||||||
|
cursor,
|
||||||
refreshTxs,
|
refreshTxs,
|
||||||
nextPage,
|
nextPage,
|
||||||
previousPage,
|
previousPage,
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns a Set of filters based on the URLSearchParams, or
|
|
||||||
* defaults to all.
|
|
||||||
* @param params
|
|
||||||
* @returns Set
|
|
||||||
*/
|
|
||||||
export function getInitialFilters(params: URLSearchParams): Set<FilterOption> {
|
|
||||||
const defaultFilters = new Set(AllFilterOptions);
|
|
||||||
|
|
||||||
const p = params.get('filters');
|
|
||||||
|
|
||||||
if (!p) {
|
|
||||||
return defaultFilters;
|
|
||||||
}
|
|
||||||
|
|
||||||
const filters = new Set<FilterOption>();
|
|
||||||
p.split(',').forEach((f) => {
|
|
||||||
if (AllFilterOptions.includes(f as FilterOption)) {
|
|
||||||
filters.add(f as FilterOption);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
if (filters.size === 0) {
|
|
||||||
return defaultFilters;
|
|
||||||
}
|
|
||||||
|
|
||||||
return filters;
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -204,7 +204,6 @@ describe('Block', () => {
|
|||||||
(useFetch as jest.Mock).mockReturnValue({
|
(useFetch as jest.Mock).mockReturnValue({
|
||||||
state: { data: createBlockResponse(1), loading: false, error: null },
|
state: { data: createBlockResponse(1), loading: false, error: null },
|
||||||
});
|
});
|
||||||
|
|
||||||
render(renderComponent(1));
|
render(renderComponent(1));
|
||||||
await waitFor(() => screen.getByTestId('block-header'));
|
await waitFor(() => screen.getByTestId('block-header'));
|
||||||
expect(screen.getByTestId('previous-block-button')).toHaveAttribute(
|
expect(screen.getByTestId('previous-block-button')).toHaveAttribute(
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
import { Link, useParams } from 'react-router-dom';
|
import { Link, useParams } from 'react-router-dom';
|
||||||
|
import { DATA_SOURCES } from '../../../config';
|
||||||
import { getDateTimeFormat } from '@vegaprotocol/utils';
|
import { getDateTimeFormat } from '@vegaprotocol/utils';
|
||||||
|
import type { TendermintBlocksResponse } from '../tendermint-blocks-response';
|
||||||
import { RouteTitle } from '../../../components/route-title';
|
import { RouteTitle } from '../../../components/route-title';
|
||||||
import { TimeAgo } from '../../../components/time-ago';
|
import { TimeAgo } from '../../../components/time-ago';
|
||||||
import {
|
import {
|
||||||
@@ -12,7 +14,7 @@ import { TxsPerBlock } from '../../../components/txs/txs-per-block';
|
|||||||
import { AsyncRenderer, Button } from '@vegaprotocol/ui-toolkit';
|
import { AsyncRenderer, Button } from '@vegaprotocol/ui-toolkit';
|
||||||
import { Routes } from '../../route-names';
|
import { Routes } from '../../route-names';
|
||||||
import { t } from '@vegaprotocol/i18n';
|
import { t } from '@vegaprotocol/i18n';
|
||||||
import { useBlockInfo } from '@vegaprotocol/tendermint';
|
import { useFetch } from '@vegaprotocol/react-helpers';
|
||||||
import { NodeLink } from '../../../components/links';
|
import { NodeLink } from '../../../components/links';
|
||||||
import { useDocumentTitle } from '../../../hooks/use-document-title';
|
import { useDocumentTitle } from '../../../hooks/use-document-title';
|
||||||
import EmptyList from '../../../components/empty-list/empty-list';
|
import EmptyList from '../../../components/empty-list/empty-list';
|
||||||
@@ -22,7 +24,10 @@ const Block = () => {
|
|||||||
useDocumentTitle(['Blocks', `Block #${block}`]);
|
useDocumentTitle(['Blocks', `Block #${block}`]);
|
||||||
const {
|
const {
|
||||||
state: { data: blockData, loading, error },
|
state: { data: blockData, loading, error },
|
||||||
} = useBlockInfo(Number(block));
|
} = useFetch<TendermintBlocksResponse>(
|
||||||
|
`${DATA_SOURCES.tendermintUrl}/block?height=${block}`,
|
||||||
|
{ cache: 'force-cache' }
|
||||||
|
);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<section>
|
<section>
|
||||||
|
|||||||
@@ -54,7 +54,7 @@ export const PartyBlockStake = ({
|
|||||||
{p?.stakingSummary.currentStakeAvailable ? (
|
{p?.stakingSummary.currentStakeAvailable ? (
|
||||||
<KeyValueTable>
|
<KeyValueTable>
|
||||||
<KeyValueTableRow noBorder={true}>
|
<KeyValueTableRow noBorder={true}>
|
||||||
<div>{t('Associated to key')}</div>
|
<div>{t('Available stake')}</div>
|
||||||
<div>
|
<div>
|
||||||
<GovernanceAssetBalance
|
<GovernanceAssetBalance
|
||||||
price={p.stakingSummary.currentStakeAvailable}
|
price={p.stakingSummary.currentStakeAvailable}
|
||||||
@@ -62,7 +62,7 @@ export const PartyBlockStake = ({
|
|||||||
</div>
|
</div>
|
||||||
</KeyValueTableRow>
|
</KeyValueTableRow>
|
||||||
<KeyValueTableRow noBorder={true}>
|
<KeyValueTableRow noBorder={true}>
|
||||||
<div>{t('Staked to validator')}</div>
|
<div>{t('Active stake')}</div>
|
||||||
<div>
|
<div>
|
||||||
<GovernanceAssetBalance price={linkedStake || '0'} />
|
<GovernanceAssetBalance price={linkedStake || '0'} />
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -15,13 +15,9 @@ import { PartyBlockAccounts } from './components/party-block-accounts';
|
|||||||
import { isValidPartyId } from './components/party-id-error';
|
import { isValidPartyId } from './components/party-id-error';
|
||||||
import { useDataProvider } from '@vegaprotocol/data-provider';
|
import { useDataProvider } from '@vegaprotocol/data-provider';
|
||||||
import { TxsListNavigation } from '../../../components/txs/tx-list-navigation';
|
import { TxsListNavigation } from '../../../components/txs/tx-list-navigation';
|
||||||
import type { FilterOption } from '../../../components/txs/tx-filter';
|
|
||||||
import { AllFilterOptions, TxsFilter } from '../../../components/txs/tx-filter';
|
import { AllFilterOptions, TxsFilter } from '../../../components/txs/tx-filter';
|
||||||
import { useSearchParams } from 'react-router-dom';
|
|
||||||
|
|
||||||
const Party = () => {
|
const Party = () => {
|
||||||
const [params] = useSearchParams();
|
|
||||||
|
|
||||||
const [filters, setFilters] = useState(new Set(AllFilterOptions));
|
const [filters, setFilters] = useState(new Set(AllFilterOptions));
|
||||||
const { party } = useParams<{ party: string }>();
|
const { party } = useParams<{ party: string }>();
|
||||||
|
|
||||||
@@ -31,21 +27,24 @@ const Party = () => {
|
|||||||
const partyId = toNonHex(party ? party : '');
|
const partyId = toNonHex(party ? party : '');
|
||||||
const { isMobile } = useScreenDimensions();
|
const { isMobile } = useScreenDimensions();
|
||||||
const visibleChars = useMemo(() => (isMobile ? 10 : 14), [isMobile]);
|
const visibleChars = useMemo(() => (isMobile ? 10 : 14), [isMobile]);
|
||||||
|
const baseFilters = `filters[tx.submitter]=${partyId}`;
|
||||||
|
const f =
|
||||||
|
filters && filters.size === 1
|
||||||
|
? `${baseFilters}&filters[cmd.type]=${Array.from(filters)[0]}`
|
||||||
|
: baseFilters;
|
||||||
|
|
||||||
const {
|
const {
|
||||||
|
hasMoreTxs,
|
||||||
nextPage,
|
nextPage,
|
||||||
refreshTxs,
|
|
||||||
previousPage,
|
previousPage,
|
||||||
error,
|
error,
|
||||||
|
refreshTxs,
|
||||||
loading,
|
loading,
|
||||||
txsData,
|
txsData,
|
||||||
hasMoreTxs,
|
hasPreviousPage,
|
||||||
updateFilters,
|
|
||||||
} = useTxsData({
|
} = useTxsData({
|
||||||
filters: filters.size === 1 ? filters : undefined,
|
limit: 25,
|
||||||
before: params.get('before') || undefined,
|
filters: f,
|
||||||
after: !params.get('before') ? params.get('after') || undefined : undefined,
|
|
||||||
party: partyId,
|
|
||||||
});
|
});
|
||||||
|
|
||||||
const variables = useMemo(() => ({ partyId }), [partyId]);
|
const variables = useMemo(() => ({ partyId }), [partyId]);
|
||||||
@@ -68,7 +67,7 @@ const Party = () => {
|
|||||||
text: t('Go back'),
|
text: t('Go back'),
|
||||||
action: () => navigate(-1),
|
action: () => navigate(-1),
|
||||||
className: 'py-1',
|
className: 'py-1',
|
||||||
size: 'small',
|
size: 'sm',
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
@@ -103,21 +102,15 @@ const Party = () => {
|
|||||||
refreshTxs={refreshTxs}
|
refreshTxs={refreshTxs}
|
||||||
nextPage={nextPage}
|
nextPage={nextPage}
|
||||||
previousPage={previousPage}
|
previousPage={previousPage}
|
||||||
hasPreviousPage={true}
|
hasPreviousPage={hasPreviousPage}
|
||||||
loading={loading}
|
loading={loading}
|
||||||
hasMoreTxs={hasMoreTxs}
|
hasMoreTxs={hasMoreTxs}
|
||||||
>
|
>
|
||||||
<TxsFilter
|
<TxsFilter filters={filters} setFilters={setFilters} />
|
||||||
filters={filters}
|
|
||||||
setFilters={(f) => {
|
|
||||||
setFilters(f);
|
|
||||||
updateFilters(f as Set<FilterOption>);
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
</TxsListNavigation>
|
</TxsListNavigation>
|
||||||
{!error && txsData ? (
|
{!error && txsData ? (
|
||||||
<TxsInfiniteList
|
<TxsInfiniteList
|
||||||
hasMoreTxs={true}
|
hasMoreTxs={hasMoreTxs}
|
||||||
areTxsLoading={loading}
|
areTxsLoading={loading}
|
||||||
txs={txsData}
|
txs={txsData}
|
||||||
loadMoreTxs={nextPage}
|
loadMoreTxs={nextPage}
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ import { Block } from './blocks/id';
|
|||||||
import { Blocks } from './blocks/home';
|
import { Blocks } from './blocks/home';
|
||||||
import { Tx } from './txs/id';
|
import { Tx } from './txs/id';
|
||||||
import { TxsList } from './txs/home';
|
import { TxsList } from './txs/home';
|
||||||
|
import flags from '../config/flags';
|
||||||
import { t } from '@vegaprotocol/i18n';
|
import { t } from '@vegaprotocol/i18n';
|
||||||
import { Routes } from './route-names';
|
import { Routes } from './route-names';
|
||||||
import { NetworkParameters } from './network-parameters';
|
import { NetworkParameters } from './network-parameters';
|
||||||
@@ -29,7 +30,6 @@ import { truncateMiddle } from '@vegaprotocol/ui-toolkit';
|
|||||||
import { remove0x } from '@vegaprotocol/utils';
|
import { remove0x } from '@vegaprotocol/utils';
|
||||||
import { PartyAccountsByAsset } from './parties/id/accounts';
|
import { PartyAccountsByAsset } from './parties/id/accounts';
|
||||||
import { Disclaimer } from './pages/disclaimer';
|
import { Disclaimer } from './pages/disclaimer';
|
||||||
import { FLAGS } from '@vegaprotocol/environment';
|
|
||||||
|
|
||||||
export type Navigable = {
|
export type Navigable = {
|
||||||
path: string;
|
path: string;
|
||||||
@@ -59,7 +59,7 @@ type Route = RouteItem & {
|
|||||||
children?: RouteItem[];
|
children?: RouteItem[];
|
||||||
};
|
};
|
||||||
|
|
||||||
const partiesRoutes: Route[] = FLAGS.EXPLORER_PARTIES
|
const partiesRoutes: Route[] = flags.parties
|
||||||
? [
|
? [
|
||||||
{
|
{
|
||||||
path: Routes.PARTIES,
|
path: Routes.PARTIES,
|
||||||
@@ -119,7 +119,7 @@ const partiesRoutes: Route[] = FLAGS.EXPLORER_PARTIES
|
|||||||
]
|
]
|
||||||
: [];
|
: [];
|
||||||
|
|
||||||
const assetsRoutes: Route[] = FLAGS.EXPLORER_ASSETS
|
const assetsRoutes: Route[] = flags.assets
|
||||||
? [
|
? [
|
||||||
{
|
{
|
||||||
path: Routes.ASSETS,
|
path: Routes.ASSETS,
|
||||||
@@ -147,7 +147,7 @@ const assetsRoutes: Route[] = FLAGS.EXPLORER_ASSETS
|
|||||||
]
|
]
|
||||||
: [];
|
: [];
|
||||||
|
|
||||||
const genesisRoutes: Route[] = FLAGS.EXPLORER_GENESIS
|
const genesisRoutes: Route[] = flags.genesis
|
||||||
? [
|
? [
|
||||||
{
|
{
|
||||||
path: Routes.GENESIS,
|
path: Routes.GENESIS,
|
||||||
@@ -163,7 +163,7 @@ const genesisRoutes: Route[] = FLAGS.EXPLORER_GENESIS
|
|||||||
]
|
]
|
||||||
: [];
|
: [];
|
||||||
|
|
||||||
const governanceRoutes: Route[] = FLAGS.EXPLORER_GOVERNANCE
|
const governanceRoutes: Route[] = flags.governance
|
||||||
? [
|
? [
|
||||||
{
|
{
|
||||||
path: Routes.GOVERNANCE,
|
path: Routes.GOVERNANCE,
|
||||||
@@ -179,7 +179,7 @@ const governanceRoutes: Route[] = FLAGS.EXPLORER_GOVERNANCE
|
|||||||
]
|
]
|
||||||
: [];
|
: [];
|
||||||
|
|
||||||
const marketsRoutes: Route[] = FLAGS.EXPLORER_MARKETS
|
const marketsRoutes: Route[] = flags.markets
|
||||||
? [
|
? [
|
||||||
{
|
{
|
||||||
path: Routes.MARKETS,
|
path: Routes.MARKETS,
|
||||||
@@ -207,7 +207,7 @@ const marketsRoutes: Route[] = FLAGS.EXPLORER_MARKETS
|
|||||||
]
|
]
|
||||||
: [];
|
: [];
|
||||||
|
|
||||||
const networkParametersRoutes: Route[] = FLAGS.EXPLORER_NETWORK_PARAMETERS
|
const networkParametersRoutes: Route[] = flags.networkParameters
|
||||||
? [
|
? [
|
||||||
{
|
{
|
||||||
path: Routes.NETWORK_PARAMETERS,
|
path: Routes.NETWORK_PARAMETERS,
|
||||||
@@ -225,7 +225,7 @@ const networkParametersRoutes: Route[] = FLAGS.EXPLORER_NETWORK_PARAMETERS
|
|||||||
]
|
]
|
||||||
: [];
|
: [];
|
||||||
|
|
||||||
const validators: Route[] = FLAGS.EXPLORER_VALIDATORS
|
const validators: Route[] = flags.validators
|
||||||
? [
|
? [
|
||||||
{
|
{
|
||||||
path: Routes.VALIDATORS,
|
path: Routes.VALIDATORS,
|
||||||
|
|||||||
@@ -1,14 +1,14 @@
|
|||||||
import { t } from '@vegaprotocol/i18n';
|
import { t } from '@vegaprotocol/i18n';
|
||||||
import { RouteTitle } from '../../../components/route-title';
|
import { RouteTitle } from '../../../components/route-title';
|
||||||
import { TxsInfiniteList } from '../../../components/txs';
|
import { TxsInfiniteList } from '../../../components/txs';
|
||||||
import { useTxsData, getInitialFilters } from '../../../hooks/use-txs-data';
|
import { useTxsData } from '../../../hooks/use-txs-data';
|
||||||
import { useDocumentTitle } from '../../../hooks/use-document-title';
|
import { useDocumentTitle } from '../../../hooks/use-document-title';
|
||||||
|
|
||||||
import { useState } from 'react';
|
import { useState } from 'react';
|
||||||
import { TxsFilter } from '../../../components/txs/tx-filter';
|
import { AllFilterOptions, TxsFilter } from '../../../components/txs/tx-filter';
|
||||||
import type { FilterOption } from '../../../components/txs/tx-filter';
|
|
||||||
import { TxsListNavigation } from '../../../components/txs/tx-list-navigation';
|
import { TxsListNavigation } from '../../../components/txs/tx-list-navigation';
|
||||||
import { useSearchParams } from 'react-router-dom';
|
|
||||||
|
const BE_TXS_PER_REQUEST = 25;
|
||||||
|
|
||||||
export const TxsList = () => {
|
export const TxsList = () => {
|
||||||
useDocumentTitle(['Transactions']);
|
useDocumentTitle(['Transactions']);
|
||||||
@@ -27,22 +27,25 @@ export const TxsList = () => {
|
|||||||
* @returns {JSX.Element} Transaction List and controls
|
* @returns {JSX.Element} Transaction List and controls
|
||||||
*/
|
*/
|
||||||
export const TxsListFiltered = () => {
|
export const TxsListFiltered = () => {
|
||||||
const [params] = useSearchParams();
|
const [filters, setFilters] = useState(new Set(AllFilterOptions));
|
||||||
const [filters, setFilters] = useState(getInitialFilters(params));
|
|
||||||
|
const f =
|
||||||
|
filters && filters.size === 1
|
||||||
|
? `filters[cmd.type]=${Array.from(filters)[0]}`
|
||||||
|
: '';
|
||||||
|
|
||||||
const {
|
const {
|
||||||
|
hasMoreTxs,
|
||||||
nextPage,
|
nextPage,
|
||||||
previousPage,
|
previousPage,
|
||||||
error,
|
error,
|
||||||
refreshTxs,
|
refreshTxs,
|
||||||
loading,
|
loading,
|
||||||
txsData,
|
txsData,
|
||||||
hasMoreTxs,
|
hasPreviousPage,
|
||||||
updateFilters,
|
|
||||||
} = useTxsData({
|
} = useTxsData({
|
||||||
filters: filters.size === 1 ? filters : undefined,
|
limit: BE_TXS_PER_REQUEST,
|
||||||
before: params.get('before') || undefined,
|
filters: f,
|
||||||
after: !params.get('before') ? params.get('after') || undefined : undefined,
|
|
||||||
});
|
});
|
||||||
|
|
||||||
return (
|
return (
|
||||||
@@ -51,17 +54,11 @@ export const TxsListFiltered = () => {
|
|||||||
refreshTxs={refreshTxs}
|
refreshTxs={refreshTxs}
|
||||||
nextPage={nextPage}
|
nextPage={nextPage}
|
||||||
previousPage={previousPage}
|
previousPage={previousPage}
|
||||||
hasPreviousPage={true}
|
hasPreviousPage={hasPreviousPage}
|
||||||
loading={loading}
|
loading={loading}
|
||||||
hasMoreTxs={hasMoreTxs}
|
hasMoreTxs={hasMoreTxs}
|
||||||
>
|
>
|
||||||
<TxsFilter
|
<TxsFilter filters={filters} setFilters={setFilters} />
|
||||||
filters={filters}
|
|
||||||
setFilters={(f) => {
|
|
||||||
setFilters(f);
|
|
||||||
updateFilters(f as Set<FilterOption>);
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
</TxsListNavigation>
|
</TxsListNavigation>
|
||||||
<TxsInfiniteList
|
<TxsInfiniteList
|
||||||
hasFilters={filters.size > 0}
|
hasFilters={filters.size > 0}
|
||||||
|
|||||||
@@ -15,9 +15,6 @@ query ExplorerNodes {
|
|||||||
stakedByDelegates
|
stakedByDelegates
|
||||||
stakedTotal
|
stakedTotal
|
||||||
pendingStake
|
pendingStake
|
||||||
rankingScore {
|
|
||||||
performanceScore
|
|
||||||
}
|
|
||||||
epochData {
|
epochData {
|
||||||
total
|
total
|
||||||
offline
|
offline
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ const defaultOptions = {} as const;
|
|||||||
export type ExplorerNodesQueryVariables = Types.Exact<{ [key: string]: never; }>;
|
export type ExplorerNodesQueryVariables = Types.Exact<{ [key: string]: never; }>;
|
||||||
|
|
||||||
|
|
||||||
export type ExplorerNodesQuery = { __typename?: 'Query', nodesConnection: { __typename?: 'NodesConnection', edges?: Array<{ __typename?: 'NodeEdge', node: { __typename?: 'Node', id: string, name: string, infoUrl: string, avatarUrl?: string | null, pubkey: string, tmPubkey: string, ethereumAddress: string, location: string, status: Types.NodeStatus, stakedByOperator: string, stakedByDelegates: string, stakedTotal: string, pendingStake: string, rankingScore: { __typename?: 'RankingScore', performanceScore: string }, epochData?: { __typename?: 'EpochData', total: number, offline: number, online: number } | null } } | null> | null } };
|
export type ExplorerNodesQuery = { __typename?: 'Query', nodesConnection: { __typename?: 'NodesConnection', edges?: Array<{ __typename?: 'NodeEdge', node: { __typename?: 'Node', id: string, name: string, infoUrl: string, avatarUrl?: string | null, pubkey: string, tmPubkey: string, ethereumAddress: string, location: string, status: Types.NodeStatus, stakedByOperator: string, stakedByDelegates: string, stakedTotal: string, pendingStake: string, epochData?: { __typename?: 'EpochData', total: number, offline: number, online: number } | null } } | null> | null } };
|
||||||
|
|
||||||
|
|
||||||
export const ExplorerNodesDocument = gql`
|
export const ExplorerNodesDocument = gql`
|
||||||
@@ -27,9 +27,6 @@ export const ExplorerNodesDocument = gql`
|
|||||||
stakedByDelegates
|
stakedByDelegates
|
||||||
stakedTotal
|
stakedTotal
|
||||||
pendingStake
|
pendingStake
|
||||||
rankingScore {
|
|
||||||
performanceScore
|
|
||||||
}
|
|
||||||
epochData {
|
epochData {
|
||||||
total
|
total
|
||||||
offline
|
offline
|
||||||
|
|||||||
@@ -91,15 +91,7 @@ export const ValidatorsPage = () => {
|
|||||||
const { data: tmData } = useTendermintValidators(5000);
|
const { data: tmData } = useTendermintValidators(5000);
|
||||||
const { data, loading, error, refetch } = useExplorerNodesQuery();
|
const { data, loading, error, refetch } = useExplorerNodesQuery();
|
||||||
|
|
||||||
const validators = compact(
|
const validators = compact(data?.nodesConnection.edges?.map((e) => e?.node));
|
||||||
data?.nodesConnection.edges
|
|
||||||
?.map((e) => e?.node)
|
|
||||||
.filter(
|
|
||||||
(node) =>
|
|
||||||
node?.rankingScore?.performanceScore &&
|
|
||||||
new BigNumber(node.rankingScore.performanceScore).isGreaterThan(0)
|
|
||||||
)
|
|
||||||
);
|
|
||||||
|
|
||||||
// voting power
|
// voting power
|
||||||
const powers = compact(tmData?.result.validators).map(
|
const powers = compact(tmData?.result.validators).map(
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 1.4 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 547 B |
Binary file not shown.
|
Before Width: | Height: | Size: 1.5 KiB |
@@ -1,20 +0,0 @@
|
|||||||
{
|
|
||||||
"short_name": "Mainnet Stats",
|
|
||||||
"name": "Vega Mainnet statistics",
|
|
||||||
"icons": [
|
|
||||||
{
|
|
||||||
"src": "favicon.ico",
|
|
||||||
"sizes": "64x64 32x32 24x24 16x16",
|
|
||||||
"type": "image/x-icon"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"src": "logo192.png",
|
|
||||||
"type": "image/png",
|
|
||||||
"sizes": "192x192"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"start_url": ".",
|
|
||||||
"display": "standalone",
|
|
||||||
"theme_color": "#000000",
|
|
||||||
"background_color": "#ffffff"
|
|
||||||
}
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
# https://www.robotstxt.org/robotstxt.html
|
|
||||||
User-agent: *
|
|
||||||
Disallow:
|
|
||||||
@@ -1,39 +1,23 @@
|
|||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html lang="en">
|
<html lang="en">
|
||||||
<head>
|
<head>
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
||||||
<meta charset="utf-8" />
|
<meta charset="utf-8" />
|
||||||
<link
|
<title>Explorer</title>
|
||||||
rel="icon"
|
<base href="/" />
|
||||||
type="image/x-icon"
|
|
||||||
href="https://static.vega.xyz/favicon.ico"
|
|
||||||
/>
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
||||||
<meta name="theme-color" content="#000000" />
|
|
||||||
<meta name="description" content="Vega Protocol - VEGA Explorer" />
|
|
||||||
<meta name="og:type" content="website" />
|
|
||||||
<meta name="og:url" content="https://explorer.vega.xyz/" />
|
|
||||||
<meta name="og:title" content="Vega Protocol - Explorer" />
|
|
||||||
<meta name="og:site_name" content="Vega Protocol - Explorer" />
|
|
||||||
<meta name="og:image" content="https://static.vega.xyz/favicon.ico" />
|
|
||||||
|
|
||||||
<meta name="twitter:card" content="https://static.vega.xyz/favicon.ico" />
|
|
||||||
<meta name="twitter:title" content="Vega Protocol - Explorer" />
|
|
||||||
<meta name="twitter:description" content="Vega Protocol - Explorer" />
|
|
||||||
<meta name="twitter:image" content="https://static.vega.xyz/favicon.ico" />
|
|
||||||
<meta name="twitter:image:alt" content="VEGA logo" />
|
|
||||||
<meta name="twitter:site" content="@vegaprotocol" />
|
|
||||||
|
|
||||||
<meta name="description" content="Vega Protocol - Explorer" />
|
|
||||||
<link rel="apple-touch-icon" href="assets/apple-touch-icon.png" />
|
|
||||||
<link rel="manifest" href="assets/manifest.json" />
|
|
||||||
<link
|
<link
|
||||||
rel="preload"
|
rel="preload"
|
||||||
href="https://static.vega.xyz/AlphaLyrae-Medium.woff2"
|
href="https://static.vega.xyz/AlphaLyrae-Medium.woff2"
|
||||||
as="font"
|
as="font"
|
||||||
type="font/woff2"
|
type="font/woff2"
|
||||||
|
crossorigin="anonymous"
|
||||||
/>
|
/>
|
||||||
<title>VEGA Explorer</title>
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||||
|
<link
|
||||||
|
rel="icon"
|
||||||
|
type="image/x-icon"
|
||||||
|
href="https://static.vega.xyz/favicon.ico"
|
||||||
|
/>
|
||||||
|
<link rel="stylesheet" href="https://static.vega.xyz/fonts.css" />
|
||||||
<script src="./assets/env-config.js"></script>
|
<script src="./assets/env-config.js"></script>
|
||||||
</head>
|
</head>
|
||||||
<body class="dark:bg-black h-full w-full">
|
<body class="dark:bg-black h-full w-full">
|
||||||
|
|||||||
@@ -18,7 +18,6 @@ NX_ANNOUNCEMENTS_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/annou
|
|||||||
NX_GITHUB_FEEDBACK_URL=https://github.com/vegaprotocol/feedback/discussions
|
NX_GITHUB_FEEDBACK_URL=https://github.com/vegaprotocol/feedback/discussions
|
||||||
NX_WALLETCONNECT_PROJECT_ID=fe8091dc35738863e509fc4947525c72
|
NX_WALLETCONNECT_PROJECT_ID=fe8091dc35738863e509fc4947525c72
|
||||||
NX_VEGA_REST_URL=http://localhost:3008/api/v2/
|
NX_VEGA_REST_URL=http://localhost:3008/api/v2/
|
||||||
NX_SUCCESSOR_MARKETS=true
|
|
||||||
|
|
||||||
#Test configuration variables
|
#Test configuration variables
|
||||||
CYPRESS_FAIRGROUND=false
|
CYPRESS_FAIRGROUND=false
|
||||||
|
|||||||
@@ -28,7 +28,6 @@ module.exports = defineConfig({
|
|||||||
numTestsKeptInMemory: 5,
|
numTestsKeptInMemory: 5,
|
||||||
downloadsFolder: 'cypress/downloads',
|
downloadsFolder: 'cypress/downloads',
|
||||||
testIsolation: false,
|
testIsolation: false,
|
||||||
experimentalMemoryManagement: true,
|
|
||||||
},
|
},
|
||||||
env: {
|
env: {
|
||||||
ethProviderUrl: 'http://localhost:8545/',
|
ethProviderUrl: 'http://localhost:8545/',
|
||||||
|
|||||||
@@ -1,107 +0,0 @@
|
|||||||
{
|
|
||||||
"changes": {
|
|
||||||
"decimalPlaces": "5",
|
|
||||||
"positionDecimalPlaces": "5",
|
|
||||||
"linearSlippageFactor": "0.001",
|
|
||||||
"quadraticSlippageFactor": "0",
|
|
||||||
"lpPriceRange": "10",
|
|
||||||
"instrument": {
|
|
||||||
"name": "Token test market",
|
|
||||||
"code": "Token.24h",
|
|
||||||
"future": {
|
|
||||||
"settlementAsset": "816af99af60d684502a40824758f6b5377e6af48e50a9ee8ef478ecb879ea8bc",
|
|
||||||
"quoteName": "fUSDC",
|
|
||||||
"dataSourceSpecForSettlementData": {
|
|
||||||
"external": {
|
|
||||||
"oracle": {
|
|
||||||
"signers": [
|
|
||||||
{
|
|
||||||
"pubKey": {
|
|
||||||
"key": "70d14a321e02e71992fd115563df765000ccc4775cbe71a0e2f9ff5a3b9dc680"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"filters": [
|
|
||||||
{
|
|
||||||
"key": {
|
|
||||||
"name": "prices.BTC.value",
|
|
||||||
"type": "TYPE_INTEGER",
|
|
||||||
"numberDecimalPlaces": "0"
|
|
||||||
},
|
|
||||||
"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_EQUALS",
|
|
||||||
"value": "true"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"dataSourceSpecBinding": {
|
|
||||||
"settlementDataProperty": "prices.BTC.value",
|
|
||||||
"tradingTerminationProperty": "trading.terminated.ETH5"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"metadata": ["sector:food", "sector:materials", "source:docs.vega.xyz"],
|
|
||||||
"priceMonitoringParameters": {
|
|
||||||
"triggers": [
|
|
||||||
{
|
|
||||||
"horizon": "43200",
|
|
||||||
"probability": "0.9999999",
|
|
||||||
"auctionExtension": "600"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"liquidityMonitoringParameters": {
|
|
||||||
"targetStakeParameters": {
|
|
||||||
"timeWindow": "3600",
|
|
||||||
"scalingFactor": 10
|
|
||||||
},
|
|
||||||
"triggeringRatio": "0.7",
|
|
||||||
"auctionExtension": "1"
|
|
||||||
},
|
|
||||||
"logNormal": {
|
|
||||||
"tau": 0.0001140771161,
|
|
||||||
"riskAversionParameter": 0.001,
|
|
||||||
"params": {
|
|
||||||
"mu": 0,
|
|
||||||
"r": 0.016,
|
|
||||||
"sigma": 0.8
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"successor": {
|
|
||||||
"parentMarketId": "",
|
|
||||||
"insurancePoolFraction": "0.75"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -11,9 +11,7 @@ import {
|
|||||||
getDateFormatForSpecifiedDays,
|
getDateFormatForSpecifiedDays,
|
||||||
getProposalFromTitle,
|
getProposalFromTitle,
|
||||||
getProposalInformationFromTable,
|
getProposalInformationFromTable,
|
||||||
proposalChangeType,
|
|
||||||
submitUniqueRawProposal,
|
submitUniqueRawProposal,
|
||||||
validateProposalDetailsDiff,
|
|
||||||
voteForProposal,
|
voteForProposal,
|
||||||
} from '../../../../governance-e2e/src/support/governance.functions';
|
} from '../../../../governance-e2e/src/support/governance.functions';
|
||||||
import {
|
import {
|
||||||
@@ -28,9 +26,7 @@ import {
|
|||||||
} from '../../support/wallet-functions';
|
} from '../../support/wallet-functions';
|
||||||
import type { testFreeformProposal } from '../../support/common-interfaces';
|
import type { testFreeformProposal } from '../../support/common-interfaces';
|
||||||
import { formatDateWithLocalTimezone } from '@vegaprotocol/utils';
|
import { formatDateWithLocalTimezone } from '@vegaprotocol/utils';
|
||||||
import { createSuccessorMarketProposalTxBody } from '../../support/proposal.functions';
|
|
||||||
|
|
||||||
const proposalListItem = '[data-testid="proposals-list-item"]';
|
|
||||||
const proposalVoteProgressForPercentage =
|
const proposalVoteProgressForPercentage =
|
||||||
'vote-progress-indicator-percentage-for';
|
'vote-progress-indicator-percentage-for';
|
||||||
const proposalVoteProgressAgainstPercentage =
|
const proposalVoteProgressAgainstPercentage =
|
||||||
@@ -46,7 +42,6 @@ const viewProposalButton = 'view-proposal-btn';
|
|||||||
const proposalDescriptionToggle = 'proposal-description-toggle';
|
const proposalDescriptionToggle = 'proposal-description-toggle';
|
||||||
const voteBreakdownToggle = 'vote-breakdown-toggle';
|
const voteBreakdownToggle = 'vote-breakdown-toggle';
|
||||||
const proposalTermsToggle = 'proposal-json-toggle';
|
const proposalTermsToggle = 'proposal-json-toggle';
|
||||||
const marketDataToggle = 'proposal-market-data-toggle';
|
|
||||||
|
|
||||||
describe(
|
describe(
|
||||||
'Governance flow for proposal details',
|
'Governance flow for proposal details',
|
||||||
@@ -55,12 +50,12 @@ describe(
|
|||||||
before('connect wallets and set approval limit', function () {
|
before('connect wallets and set approval limit', function () {
|
||||||
cy.visit('/');
|
cy.visit('/');
|
||||||
ethereumWalletConnect();
|
ethereumWalletConnect();
|
||||||
|
// cy.associateTokensToVegaWallet('1');
|
||||||
});
|
});
|
||||||
|
|
||||||
beforeEach('visit proposals tab', function () {
|
beforeEach('visit proposals tab', function () {
|
||||||
cy.clearLocalStorage();
|
cy.clearLocalStorage();
|
||||||
turnTelemetryOff();
|
turnTelemetryOff();
|
||||||
cy.mockChainId();
|
|
||||||
cy.reload();
|
cy.reload();
|
||||||
waitForSpinner();
|
waitForSpinner();
|
||||||
cy.connectVegaWallet();
|
cy.connectVegaWallet();
|
||||||
@@ -223,33 +218,17 @@ describe(
|
|||||||
getProposalInformationFromTable('Tokens for proposal')
|
getProposalInformationFromTable('Tokens for proposal')
|
||||||
.should('have.text', (1).toFixed(2))
|
.should('have.text', (1).toFixed(2))
|
||||||
.and('be.visible');
|
.and('be.visible');
|
||||||
navigateTo(navigation.proposals);
|
|
||||||
cy.get<testFreeformProposal>('@rawProposal').then((rawProposal) => {
|
|
||||||
getProposalFromTitle(rawProposal.rationale.title).within(() => {
|
|
||||||
// 3002-PROP-021
|
|
||||||
cy.getByTestId('user-voted-yes').should('exist');
|
|
||||||
cy.getByTestId(viewProposalButton).click();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
cy.getByTestId(changeVoteButton).should('be.visible').click();
|
cy.getByTestId(changeVoteButton).should('be.visible').click();
|
||||||
voteForProposal('against');
|
voteForProposal('against');
|
||||||
cy.getByTestId(proposalVoteProgressAgainstPercentage)
|
cy.getByTestId(proposalVoteProgressAgainstPercentage)
|
||||||
.contains('100.00%')
|
.contains('100.00%')
|
||||||
.and('be.visible');
|
.and('be.visible');
|
||||||
cy.getByTestId(voteBreakdownToggle).click();
|
|
||||||
getProposalInformationFromTable('Tokens against proposal')
|
getProposalInformationFromTable('Tokens against proposal')
|
||||||
.should('have.text', (1).toFixed(2))
|
.should('have.text', (1).toFixed(2))
|
||||||
.and('be.visible');
|
.and('be.visible');
|
||||||
getProposalInformationFromTable('Number of voting parties')
|
getProposalInformationFromTable('Number of voting parties')
|
||||||
.should('have.text', '1')
|
.should('have.text', '1')
|
||||||
.and('be.visible');
|
.and('be.visible');
|
||||||
navigateTo(navigation.proposals);
|
|
||||||
cy.get<testFreeformProposal>('@rawProposal').then((rawProposal) => {
|
|
||||||
getProposalFromTitle(rawProposal.rationale.title).within(() => {
|
|
||||||
cy.getByTestId('user-voted-no').should('exist');
|
|
||||||
cy.getByTestId(viewProposalButton).click();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
|
||||||
// 3001-VOTE-042, 3001-VOTE-057, 3001-VOTE-058, 3001-VOTE-059, 3001-VOTE-060
|
// 3001-VOTE-042, 3001-VOTE-057, 3001-VOTE-058, 3001-VOTE-059, 3001-VOTE-060
|
||||||
@@ -359,98 +338,5 @@ describe(
|
|||||||
switchVegaWalletPubKey();
|
switchVegaWalletPubKey();
|
||||||
stakingPageDisassociateAllTokens();
|
stakingPageDisassociateAllTokens();
|
||||||
});
|
});
|
||||||
|
|
||||||
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)
|
|
||||||
.last()
|
|
||||||
.within(() => {
|
|
||||||
cy.getByTestId(viewProposalButton).click();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
getProposalInformationFromTable('ID')
|
|
||||||
.invoke('text')
|
|
||||||
.as('parentMarketId')
|
|
||||||
.then(() => {
|
|
||||||
cy.VegaWalletSubmitProposal(
|
|
||||||
createSuccessorMarketProposalTxBody(this.parentMarketId)
|
|
||||||
);
|
|
||||||
});
|
|
||||||
navigateTo(navigation.proposals);
|
|
||||||
cy.reload();
|
|
||||||
getProposalFromTitle('Test successor market proposal details').within(
|
|
||||||
() => cy.getByTestId(viewProposalButton).click()
|
|
||||||
);
|
|
||||||
// #3003-PMAN-010
|
|
||||||
cy.getByTestId(proposalTermsToggle).click();
|
|
||||||
cy.get('.language-json').within(() => {
|
|
||||||
cy.get('.hljs-attr').should('contain.text', 'parentMarketId');
|
|
||||||
cy.get('.hljs-string').should('contain.text', this.parentMarketId);
|
|
||||||
cy.get('.hljs-attr').should('contain.text', 'insurancePoolFraction');
|
|
||||||
cy.get('.hljs-string').should('contain.text', '0.75');
|
|
||||||
});
|
|
||||||
// 3003-PMAN-011 3003-PMAN-012
|
|
||||||
cy.getByTestId(marketDataToggle).click();
|
|
||||||
cy.getByTestId('proposal-market-data').within(() => {
|
|
||||||
cy.contains('Key details').click();
|
|
||||||
validateProposalDetailsDiff(
|
|
||||||
'Name',
|
|
||||||
proposalChangeType.UPDATED,
|
|
||||||
'Token test market',
|
|
||||||
'Test market 1'
|
|
||||||
);
|
|
||||||
validateProposalDetailsDiff(
|
|
||||||
'Parent Market ID',
|
|
||||||
proposalChangeType.ADDED,
|
|
||||||
this.parentMarketId
|
|
||||||
);
|
|
||||||
validateProposalDetailsDiff(
|
|
||||||
'Insurance Pool Fraction',
|
|
||||||
proposalChangeType.ADDED,
|
|
||||||
'0.75'
|
|
||||||
);
|
|
||||||
validateProposalDetailsDiff(
|
|
||||||
'Trading Mode',
|
|
||||||
proposalChangeType.UPDATED,
|
|
||||||
'No trading',
|
|
||||||
'Opening auction'
|
|
||||||
);
|
|
||||||
|
|
||||||
cy.contains('Instrument').click();
|
|
||||||
validateProposalDetailsDiff(
|
|
||||||
'Market Name',
|
|
||||||
proposalChangeType.UPDATED,
|
|
||||||
'Token test market',
|
|
||||||
'Test market 1'
|
|
||||||
);
|
|
||||||
|
|
||||||
cy.contains('Metadata').click();
|
|
||||||
validateProposalDetailsDiff(
|
|
||||||
'Sector',
|
|
||||||
proposalChangeType.UPDATED,
|
|
||||||
'materials',
|
|
||||||
'tech'
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
// 3003-PMAN-011
|
|
||||||
cy.get('.underline').contains('Parent Market ID').realHover();
|
|
||||||
cy.getByTestId('tooltip-content', { timeout: 8000 }).should(
|
|
||||||
'contain.text',
|
|
||||||
'The ID of the market this market succeeds.'
|
|
||||||
);
|
|
||||||
cy.get('.underline')
|
|
||||||
.contains('Insurance Pool Fraction')
|
|
||||||
.realMouseUp()
|
|
||||||
.realHover();
|
|
||||||
cy.getByTestId('tooltip-content', { timeout: 8000 }).should(
|
|
||||||
'contain.text',
|
|
||||||
'The fraction of the insurance pool balance that is carried over from the parent market to the successor.'
|
|
||||||
);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -26,8 +26,6 @@ const votesTable = 'votes-table';
|
|||||||
const openProposals = 'open-proposals';
|
const openProposals = 'open-proposals';
|
||||||
const proposalVoteProgressForPercentage =
|
const proposalVoteProgressForPercentage =
|
||||||
'vote-progress-indicator-percentage-for';
|
'vote-progress-indicator-percentage-for';
|
||||||
const majorityVoteReached = 'majority-reached';
|
|
||||||
const minParticipationReached = 'participation-reached';
|
|
||||||
const proposalTimeout = { timeout: 8000 };
|
const proposalTimeout = { timeout: 8000 };
|
||||||
|
|
||||||
context(
|
context(
|
||||||
@@ -42,7 +40,6 @@ context(
|
|||||||
beforeEach('visit proposals', function () {
|
beforeEach('visit proposals', function () {
|
||||||
cy.clearLocalStorage();
|
cy.clearLocalStorage();
|
||||||
turnTelemetryOff();
|
turnTelemetryOff();
|
||||||
cy.mockChainId();
|
|
||||||
cy.reload();
|
cy.reload();
|
||||||
waitForSpinner();
|
waitForSpinner();
|
||||||
cy.connectVegaWallet();
|
cy.connectVegaWallet();
|
||||||
@@ -75,7 +72,7 @@ context(
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
// 3001-VOTE-020 3001-VOTE-021 3001-VOTE-046 3001-VOTE-044 3001-VOTE-074 3001-VOTE-074
|
// 3001-VOTE-046 3001-VOTE-044 3001-VOTE-074 3001-VOTE-074
|
||||||
it('Able to enact proposal by voting', function () {
|
it('Able to enact proposal by voting', function () {
|
||||||
const proposalTitle = 'Add New proposal with short enactment';
|
const proposalTitle = 'Add New proposal with short enactment';
|
||||||
const proposalTx = createUpdateNetworkProposalTxBody();
|
const proposalTx = createUpdateNetworkProposalTxBody();
|
||||||
@@ -88,18 +85,10 @@ context(
|
|||||||
cy.contains(proposalTitle)
|
cy.contains(proposalTitle)
|
||||||
.parentsUntil(proposalListItem)
|
.parentsUntil(proposalListItem)
|
||||||
.last()
|
.last()
|
||||||
.within(() => {
|
.within(() => cy.getByTestId(viewProposalButton).click());
|
||||||
// 3001-VOTE-019 time to vote is highlighted red
|
|
||||||
cy.getByTestId('vote-details')
|
|
||||||
.find('span')
|
|
||||||
.should('have.class', 'text-vega-pink');
|
|
||||||
cy.getByTestId(viewProposalButton).click();
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
cy.getByTestId(proposalStatus).should('have.text', 'Open');
|
cy.getByTestId(proposalStatus).should('have.text', 'Open');
|
||||||
voteForProposal('for');
|
voteForProposal('for');
|
||||||
cy.getByTestId(majorityVoteReached).should('exist');
|
|
||||||
cy.getByTestId(minParticipationReached).should('exist');
|
|
||||||
cy.getByTestId(proposalStatus, proposalTimeout)
|
cy.getByTestId(proposalStatus, proposalTimeout)
|
||||||
.should('have.text', 'Passed')
|
.should('have.text', 'Passed')
|
||||||
.then(() => {
|
.then(() => {
|
||||||
@@ -115,14 +104,6 @@ context(
|
|||||||
cy.getByTestId(proposalVoteProgressForPercentage)
|
cy.getByTestId(proposalVoteProgressForPercentage)
|
||||||
.contains('100.00%')
|
.contains('100.00%')
|
||||||
.and('be.visible');
|
.and('be.visible');
|
||||||
navigateTo(navigation.proposals);
|
|
||||||
cy.contains(proposalTitle)
|
|
||||||
.parentsUntil(proposalListItem)
|
|
||||||
.last()
|
|
||||||
.within(() => {
|
|
||||||
cy.getByTestId(majorityVoteReached).should('exist');
|
|
||||||
cy.getByTestId(minParticipationReached).should('exist');
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
|
||||||
// 3001-VOTE-047
|
// 3001-VOTE-047
|
||||||
|
|||||||
@@ -82,7 +82,6 @@ context(
|
|||||||
cy.clearLocalStorage();
|
cy.clearLocalStorage();
|
||||||
turnTelemetryOff();
|
turnTelemetryOff();
|
||||||
cy.reload();
|
cy.reload();
|
||||||
cy.mockChainId();
|
|
||||||
waitForSpinner();
|
waitForSpinner();
|
||||||
cy.connectVegaWallet();
|
cy.connectVegaWallet();
|
||||||
ethereumWalletConnect();
|
ethereumWalletConnect();
|
||||||
@@ -321,8 +320,8 @@ context(
|
|||||||
// 3001-VOTE-076
|
// 3001-VOTE-076
|
||||||
cy.getByTestId(connectToVegaWalletButton)
|
cy.getByTestId(connectToVegaWalletButton)
|
||||||
.should('be.visible')
|
.should('be.visible')
|
||||||
.and('have.text', 'Connect Vega wallet');
|
.and('have.text', 'Connect Vega wallet')
|
||||||
cy.getByTestId(connectToVegaWalletButton).click();
|
.click();
|
||||||
cy.getByTestId('connector-jsonRpc').click();
|
cy.getByTestId('connector-jsonRpc').click();
|
||||||
cy.getByTestId(vegaWalletNameElement).should('be.visible');
|
cy.getByTestId(vegaWalletNameElement).should('be.visible');
|
||||||
cy.getByTestId(connectToVegaWalletButton).should('not.exist');
|
cy.getByTestId(connectToVegaWalletButton).should('not.exist');
|
||||||
|
|||||||
@@ -74,7 +74,6 @@ context(
|
|||||||
beforeEach('visit governance tab', function () {
|
beforeEach('visit governance tab', function () {
|
||||||
cy.clearLocalStorage();
|
cy.clearLocalStorage();
|
||||||
turnTelemetryOff();
|
turnTelemetryOff();
|
||||||
cy.mockChainId();
|
|
||||||
cy.reload();
|
cy.reload();
|
||||||
waitForSpinner();
|
waitForSpinner();
|
||||||
cy.connectVegaWallet();
|
cy.connectVegaWallet();
|
||||||
@@ -221,7 +220,7 @@ context(
|
|||||||
function () {
|
function () {
|
||||||
const proposalTitle = 'Test new market proposal';
|
const proposalTitle = 'Test new market proposal';
|
||||||
goToMakeNewProposal(governanceProposalType.NEW_MARKET);
|
goToMakeNewProposal(governanceProposalType.NEW_MARKET);
|
||||||
cy.getByTestId(newProposalTitle).type(proposalTitle);
|
cy.getByTestId(newProposalTitle).type('Test new market proposal');
|
||||||
cy.getByTestId(newProposalDescription).type('E2E test for proposals');
|
cy.getByTestId(newProposalDescription).type('E2E test for proposals');
|
||||||
cy.fixture('/proposals/new-market').then((newMarketProposal) => {
|
cy.fixture('/proposals/new-market').then((newMarketProposal) => {
|
||||||
const newMarketPayload = JSON.stringify(newMarketProposal);
|
const newMarketPayload = JSON.stringify(newMarketProposal);
|
||||||
@@ -607,57 +606,6 @@ context(
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
it('able to submit successor market proposal', function () {
|
|
||||||
const proposalTitle = 'Test successor market proposal';
|
|
||||||
|
|
||||||
cy.createMarket();
|
|
||||||
cy.reload();
|
|
||||||
waitForSpinner();
|
|
||||||
cy.getByTestId('closed-proposals').within(() => {
|
|
||||||
cy.contains('Add Lorem Ipsum market')
|
|
||||||
.parentsUntil(proposalListItem)
|
|
||||||
.last()
|
|
||||||
.within(() => {
|
|
||||||
cy.getByTestId(viewProposalBtn).click();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
getProposalInformationFromTable('ID').invoke('text').as('parentMarketId');
|
|
||||||
goToMakeNewProposal(governanceProposalType.NEW_MARKET);
|
|
||||||
cy.getByTestId(newProposalTitle).type(proposalTitle);
|
|
||||||
cy.getByTestId(newProposalDescription).type(
|
|
||||||
'E2E test for successor market'
|
|
||||||
);
|
|
||||||
cy.fixture('/proposals/successor-market').then((newMarketProposal) => {
|
|
||||||
newMarketProposal.changes.successor.parentMarketId =
|
|
||||||
this.parentMarketId;
|
|
||||||
const newMarketPayload = JSON.stringify(newMarketProposal);
|
|
||||||
cy.getByTestId(newProposalTerms).type(newMarketPayload, {
|
|
||||||
parseSpecialCharSequences: false,
|
|
||||||
delay: 2,
|
|
||||||
});
|
|
||||||
});
|
|
||||||
cy.getByTestId(proposalDownloadBtn)
|
|
||||||
.should('be.visible')
|
|
||||||
.click()
|
|
||||||
.then(() => {
|
|
||||||
cy.wrap(
|
|
||||||
getDownloadedProposalJsonPath('vega-new-market-proposal-')
|
|
||||||
).then((filePath) => {
|
|
||||||
goToMakeNewProposal(governanceProposalType.RAW);
|
|
||||||
submitUniqueRawProposal({ proposalBody: filePath });
|
|
||||||
});
|
|
||||||
});
|
|
||||||
navigateTo(navigation.proposals);
|
|
||||||
getProposalFromTitle(proposalTitle).within(() => {
|
|
||||||
// 3003-PMAN-008
|
|
||||||
cy.getByTestId('proposal-successor-info')
|
|
||||||
.should('have.text', 'Successor market to: TEST.24h')
|
|
||||||
.find('a')
|
|
||||||
.should('have.attr', 'href')
|
|
||||||
.and('contain', this.parentMarketId);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
after('Disassociate from second wallet key if present', function () {
|
after('Disassociate from second wallet key if present', function () {
|
||||||
cy.reload();
|
cy.reload();
|
||||||
waitForSpinner();
|
waitForSpinner();
|
||||||
@@ -694,7 +642,6 @@ context(
|
|||||||
.getByTestId('key-value-table-row')
|
.getByTestId('key-value-table-row')
|
||||||
.contains(heading)
|
.contains(heading)
|
||||||
.parent()
|
.parent()
|
||||||
.parent()
|
|
||||||
.siblings();
|
.siblings();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -42,7 +42,6 @@ describe('Governance flow for proposal list', { tags: '@slow' }, function () {
|
|||||||
cy.clearLocalStorage();
|
cy.clearLocalStorage();
|
||||||
turnTelemetryOff();
|
turnTelemetryOff();
|
||||||
cy.reload();
|
cy.reload();
|
||||||
cy.mockChainId();
|
|
||||||
waitForSpinner();
|
waitForSpinner();
|
||||||
cy.connectVegaWallet();
|
cy.connectVegaWallet();
|
||||||
ethereumWalletConnect();
|
ethereumWalletConnect();
|
||||||
@@ -50,8 +49,8 @@ describe('Governance flow for proposal list', { tags: '@slow' }, function () {
|
|||||||
navigateTo(navigation.proposals);
|
navigateTo(navigation.proposals);
|
||||||
});
|
});
|
||||||
|
|
||||||
// 3001-VOTE-018
|
|
||||||
it('Newly created proposals list - proposals closest to closing date appear higher in list', function () {
|
it('Newly created proposals list - proposals closest to closing date appear higher in list', function () {
|
||||||
|
// 3001-VOTE-005
|
||||||
const proposalDays = [364, 50, 2];
|
const proposalDays = [364, 50, 2];
|
||||||
for (let index = 0; index < proposalDays.length; index++) {
|
for (let index = 0; index < proposalDays.length; index++) {
|
||||||
goToMakeNewProposal(governanceProposalType.RAW);
|
goToMakeNewProposal(governanceProposalType.RAW);
|
||||||
@@ -121,24 +120,16 @@ describe('Governance flow for proposal list', { tags: '@slow' }, function () {
|
|||||||
submitUniqueRawProposal({ proposalTitle: proposalTitle });
|
submitUniqueRawProposal({ proposalTitle: proposalTitle });
|
||||||
getProposalFromTitle(proposalTitle).within(() => {
|
getProposalFromTitle(proposalTitle).within(() => {
|
||||||
// 3001-VOTE-039
|
// 3001-VOTE-039
|
||||||
cy.getByTestId('participation-not-reached').should(
|
cy.getByTestId(voteStatus).should(
|
||||||
'have.text',
|
'have.text',
|
||||||
'Min. participation not reached'
|
'Participation not reached'
|
||||||
);
|
);
|
||||||
cy.getByTestId(viewProposalButton).click();
|
cy.getByTestId(viewProposalButton).click();
|
||||||
});
|
});
|
||||||
voteForProposal('for');
|
voteForProposal('for');
|
||||||
navigateTo(navigation.proposals);
|
navigateTo(navigation.proposals);
|
||||||
getProposalFromTitle(proposalTitle).within(() => {
|
getProposalFromTitle(proposalTitle).within(() => {
|
||||||
cy.getByTestId(voteStatus).should(
|
cy.getByTestId(voteStatus).should('have.text', 'Set to pass');
|
||||||
'have.text',
|
|
||||||
'Currently expected to pass'
|
|
||||||
);
|
|
||||||
cy.getByTestId('user-voted-yes').should('exist');
|
|
||||||
cy.getByTestId('participation-reached').should(
|
|
||||||
'have.text',
|
|
||||||
'Min. participation reached'
|
|
||||||
);
|
|
||||||
cy.getByTestId(viewProposalButton).click();
|
cy.getByTestId(viewProposalButton).click();
|
||||||
});
|
});
|
||||||
cy.getByTestId(voteBreakDownToggle).click();
|
cy.getByTestId(voteBreakDownToggle).click();
|
||||||
|
|||||||
@@ -26,7 +26,6 @@ context('rewards - flow', { tags: '@slow' }, function () {
|
|||||||
before('set up environment to allow rewards', function () {
|
before('set up environment to allow rewards', function () {
|
||||||
cy.clearLocalStorage();
|
cy.clearLocalStorage();
|
||||||
turnTelemetryOff();
|
turnTelemetryOff();
|
||||||
cy.mockChainId();
|
|
||||||
cy.visit('/');
|
cy.visit('/');
|
||||||
waitForSpinner();
|
waitForSpinner();
|
||||||
ethereumWalletConnect();
|
ethereumWalletConnect();
|
||||||
@@ -97,14 +96,12 @@ context('rewards - flow', { tags: '@slow' }, function () {
|
|||||||
.within(() => {
|
.within(() => {
|
||||||
cy.get('h2').first().should('contain.text', 'EPOCH');
|
cy.get('h2').first().should('contain.text', 'EPOCH');
|
||||||
cy.getByTestId('individual-rewards-asset').should('have.text', 'Vega');
|
cy.getByTestId('individual-rewards-asset').should('have.text', 'Vega');
|
||||||
cy.getByTestId('ACCOUNT_TYPE_GLOBAL_REWARD', rewardsTimeOut).should(
|
cy.getByTestId('ACCOUNT_TYPE_GLOBAL_REWARD', rewardsTimeOut)
|
||||||
'contain.text',
|
.should('contain.text', '0.4415')
|
||||||
'0.4415'
|
.and('contain.text', '(44.15%)');
|
||||||
);
|
cy.getByTestId('ACCOUNT_TYPE_FEES_INFRASTRUCTURE')
|
||||||
cy.getByTestId('ACCOUNT_TYPE_FEES_INFRASTRUCTURE').should(
|
.should('contain.text', '0.0004')
|
||||||
'contain.text',
|
.and('contain.text', '(44.15%)');
|
||||||
'0.0004'
|
|
||||||
);
|
|
||||||
cy.getByTestId('total').should('have.text', '0.4419');
|
cy.getByTestId('total').should('have.text', '0.4419');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -25,7 +25,6 @@ import {
|
|||||||
vegaWalletSetSpecifiedApprovalAmount,
|
vegaWalletSetSpecifiedApprovalAmount,
|
||||||
vegaWalletTeardown,
|
vegaWalletTeardown,
|
||||||
} from '../../support/wallet-functions';
|
} from '../../support/wallet-functions';
|
||||||
|
|
||||||
const stakeValidatorListTotalStake = 'total-stake';
|
const stakeValidatorListTotalStake = 'total-stake';
|
||||||
const stakeValidatorListTotalShare = 'total-stake-share';
|
const stakeValidatorListTotalShare = 'total-stake-share';
|
||||||
const stakeValidatorListStakePercentage = 'stake-percentage';
|
const stakeValidatorListStakePercentage = 'stake-percentage';
|
||||||
@@ -68,7 +67,6 @@ context(
|
|||||||
function () {
|
function () {
|
||||||
cy.clearLocalStorage();
|
cy.clearLocalStorage();
|
||||||
turnTelemetryOff();
|
turnTelemetryOff();
|
||||||
cy.mockChainId();
|
|
||||||
// Go to homepage to allow wallet teardown without epoch timer refreshing page
|
// Go to homepage to allow wallet teardown without epoch timer refreshing page
|
||||||
navigateTo(navigation.home);
|
navigateTo(navigation.home);
|
||||||
vegaWalletTeardown();
|
vegaWalletTeardown();
|
||||||
@@ -146,7 +144,7 @@ context(
|
|||||||
closeStakingDialog();
|
closeStakingDialog();
|
||||||
navigateTo(navigation.validators);
|
navigateTo(navigation.validators);
|
||||||
cy.getByTestId(viewStakedByMeToggle).click();
|
cy.getByTestId(viewStakedByMeToggle).click();
|
||||||
cy.getByTestId(userStakeBtn, epochTimeout).should('have.length', 2);
|
cy.getByTestId(userStakeBtn).should('have.length', 2);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('Able to stake against a validator - using vega from vesting contract', function () {
|
it('Able to stake against a validator - using vega from vesting contract', function () {
|
||||||
|
|||||||
@@ -56,7 +56,6 @@ context(
|
|||||||
function () {
|
function () {
|
||||||
cy.clearLocalStorage();
|
cy.clearLocalStorage();
|
||||||
turnTelemetryOff();
|
turnTelemetryOff();
|
||||||
cy.mockChainId();
|
|
||||||
cy.reload();
|
cy.reload();
|
||||||
waitForSpinner();
|
waitForSpinner();
|
||||||
cy.connectVegaWallet();
|
cy.connectVegaWallet();
|
||||||
@@ -352,12 +351,6 @@ context(
|
|||||||
);
|
);
|
||||||
stakingPageDisassociateAllTokens();
|
stakingPageDisassociateAllTokens();
|
||||||
});
|
});
|
||||||
|
|
||||||
it('Able to associate over 1 million tokens', function () {
|
|
||||||
cy.get(ethWalletAssociateButton).click();
|
|
||||||
stakingPageAssociateTokens('2000000', { approve: true });
|
|
||||||
stakingPageDisassociateAllTokens();
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -50,7 +50,6 @@ context(
|
|||||||
beforeEach('Navigate to withdrawal page', function () {
|
beforeEach('Navigate to withdrawal page', function () {
|
||||||
cy.clearLocalStorage();
|
cy.clearLocalStorage();
|
||||||
turnTelemetryOff();
|
turnTelemetryOff();
|
||||||
cy.mockChainId();
|
|
||||||
cy.reload();
|
cy.reload();
|
||||||
waitForSpinner();
|
waitForSpinner();
|
||||||
navigateTo(navigation.withdraw);
|
navigateTo(navigation.withdraw);
|
||||||
@@ -97,8 +96,7 @@ context(
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
// eslint-disable-next-line
|
it(
|
||||||
it.skip(
|
|
||||||
'Able to withdraw asset: -eth wallet connected -withdraw funds button',
|
'Able to withdraw asset: -eth wallet connected -withdraw funds button',
|
||||||
{ tags: '@smoke' },
|
{ tags: '@smoke' },
|
||||||
function () {
|
function () {
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ context('Home Page - verify elements on page', { tags: '@smoke' }, function () {
|
|||||||
cy.getByTestId('home-proposals').within(() => {
|
cy.getByTestId('home-proposals').within(() => {
|
||||||
cy.get('[href="/proposals"]')
|
cy.get('[href="/proposals"]')
|
||||||
.should('exist')
|
.should('exist')
|
||||||
.and('have.text', 'See all proposals');
|
.and('have.text', 'Browse, vote, and propose');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -161,7 +161,7 @@ context('Home Page - verify elements on page', { tags: '@smoke' }, function () {
|
|||||||
cy.getByTestId('menu-drawer').should('be.visible');
|
cy.getByTestId('menu-drawer').should('be.visible');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should have link for proposal page', function () {
|
it.skip('should have link for proposal page', function () {
|
||||||
cy.getByTestId('menu-drawer').within(() => {
|
cy.getByTestId('menu-drawer').within(() => {
|
||||||
cy.get('[href="/proposals"]')
|
cy.get('[href="/proposals"]')
|
||||||
.should('exist')
|
.should('exist')
|
||||||
|
|||||||
@@ -17,7 +17,6 @@ const governanceDocsUrl = 'https://vega.xyz/governance';
|
|||||||
const networkUpgradeProposalListItem = 'protocol-upgrade-proposals-list-item';
|
const networkUpgradeProposalListItem = 'protocol-upgrade-proposals-list-item';
|
||||||
const closedProposals = 'closed-proposals';
|
const closedProposals = 'closed-proposals';
|
||||||
const closedProposalToggle = 'closed-proposals-toggle-networkUpgrades';
|
const closedProposalToggle = 'closed-proposals-toggle-networkUpgrades';
|
||||||
const protocolUpgradeTime = 'protocol-upgrade-time';
|
|
||||||
|
|
||||||
context(
|
context(
|
||||||
'Governance Page - verify elements on page',
|
'Governance Page - verify elements on page',
|
||||||
@@ -162,7 +161,7 @@ context(
|
|||||||
);
|
);
|
||||||
cy.getByTestId('protocol-upgrade-proposal-status').should(
|
cy.getByTestId('protocol-upgrade-proposal-status').should(
|
||||||
'have.text',
|
'have.text',
|
||||||
'Approved by validators'
|
'Approved by validators '
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@@ -175,7 +174,6 @@ context(
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
// 3009-NTWU-003 3009-NTWU-004 3009-NTWU-007
|
|
||||||
it('should see details of network upgrade proposal', function () {
|
it('should see details of network upgrade proposal', function () {
|
||||||
mockNetworkUpgradeProposal();
|
mockNetworkUpgradeProposal();
|
||||||
navigateTo(navigation.proposals);
|
navigateTo(navigation.proposals);
|
||||||
@@ -229,51 +227,5 @@ context(
|
|||||||
cy.getByTestId(networkUpgradeProposalListItem).should('not.exist');
|
cy.getByTestId(networkUpgradeProposalListItem).should('not.exist');
|
||||||
cy.getByTestId(closedProposalToggle).should('not.exist');
|
cy.getByTestId(closedProposalToggle).should('not.exist');
|
||||||
});
|
});
|
||||||
|
|
||||||
// 3009-NTWU-001 3009-NTWU-002 3009-NTWU-006 3009-NTWU-009
|
|
||||||
it.skip('should display network upgrade banner with estimate', function () {
|
|
||||||
mockNetworkUpgradeProposal();
|
|
||||||
cy.visit('/');
|
|
||||||
cy.getByTestId('banners').within(() => {
|
|
||||||
cy.get('div')
|
|
||||||
.should('contain.text', 'The network will upgrade to v1 in ')
|
|
||||||
.and(
|
|
||||||
'contain.text',
|
|
||||||
'Trading activity will be interrupted, manage your risk appropriately.'
|
|
||||||
);
|
|
||||||
cy.getByTestId('external-link')
|
|
||||||
.should('have.attr', 'href')
|
|
||||||
.and('contain', '/proposals/protocol-upgrade/v1');
|
|
||||||
});
|
|
||||||
|
|
||||||
// estimate does not display possibly due to mocks or Cypress unless the proposal is clicked on several times
|
|
||||||
// By default the application waits for 10 blocks until showing estimate - roughly 10 seconds
|
|
||||||
for (let i = 0; i < 3; i++) {
|
|
||||||
// eslint-disable-next-line cypress/no-unnecessary-waiting
|
|
||||||
cy.wait(3000);
|
|
||||||
navigateTo(navigation.proposals);
|
|
||||||
cy.getByTestId(networkUpgradeProposalListItem)
|
|
||||||
.first()
|
|
||||||
.find('[data-testid="view-proposal-btn"]')
|
|
||||||
.click();
|
|
||||||
}
|
|
||||||
cy.getByTestId('upgrade-proposal-estimate')
|
|
||||||
.invoke('text')
|
|
||||||
.as('displayedEstimate');
|
|
||||||
cy.get('@displayedEstimate').then((estimateText) => {
|
|
||||||
// Estimated time should automatically update every second
|
|
||||||
cy.getByTestId(protocolUpgradeTime)
|
|
||||||
.invoke('text')
|
|
||||||
.should('not.eq', estimateText);
|
|
||||||
});
|
|
||||||
// time estimate on proposal detail
|
|
||||||
cy.getByTestId('protocol-upgrade-proposal').within(() => {
|
|
||||||
cy.get('@displayedEstimate').then((estimateText) => {
|
|
||||||
cy.getByTestId(protocolUpgradeTime)
|
|
||||||
.invoke('text')
|
|
||||||
.should('not.eq', estimateText);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -1,12 +1,13 @@
|
|||||||
/// <reference types="cypress" />
|
/// <reference types="cypress" />
|
||||||
|
|
||||||
import {
|
import {
|
||||||
|
navigateTo,
|
||||||
|
navigation,
|
||||||
turnTelemetryOff,
|
turnTelemetryOff,
|
||||||
waitForSpinner,
|
waitForSpinner,
|
||||||
} from '../../support/common.functions';
|
} from '../../support/common.functions';
|
||||||
import {
|
import {
|
||||||
createTenDigitUnixTimeStampForSpecifiedDays,
|
enterUniqueFreeFormProposalBody,
|
||||||
enterRawProposalBody,
|
|
||||||
goToMakeNewProposal,
|
goToMakeNewProposal,
|
||||||
governanceProposalType,
|
governanceProposalType,
|
||||||
} from '../../support/governance.functions';
|
} from '../../support/governance.functions';
|
||||||
@@ -46,11 +47,12 @@ context('View functionality with public key', { tags: '@smoke' }, function () {
|
|||||||
.and('contain.text', 'USDC (fake)');
|
.and('contain.text', 'USDC (fake)');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('Unable to submit proposal with public key', function () {
|
it.skip('Unable to submit proposal with public key', function () {
|
||||||
const expectedErrorTxt = `You are connected in a view only state for public key: ${vegaWalletPubKey}. In order to send transactions you must connect to a real wallet.`;
|
const expectedErrorTxt = `You are connected in a view only state for public key: ${vegaWalletPubKey}. In order to send transactions you must connect to a real wallet.`;
|
||||||
|
|
||||||
goToMakeNewProposal(governanceProposalType.RAW);
|
navigateTo(navigation.proposals);
|
||||||
enterRawProposalBody(createTenDigitUnixTimeStampForSpecifiedDays(8));
|
goToMakeNewProposal(governanceProposalType.FREEFORM);
|
||||||
|
enterUniqueFreeFormProposalBody('50', 'pub key proposal test');
|
||||||
cy.getByTestId('dialog-content')
|
cy.getByTestId('dialog-content')
|
||||||
.first()
|
.first()
|
||||||
.within(() => {
|
.within(() => {
|
||||||
|
|||||||
@@ -11,7 +11,6 @@ import {
|
|||||||
waitForBeginningOfEpoch,
|
waitForBeginningOfEpoch,
|
||||||
} from '../../support/staking.functions';
|
} from '../../support/staking.functions';
|
||||||
import { previousEpochData } from '../../fixtures/mocks/previous-epoch';
|
import { previousEpochData } from '../../fixtures/mocks/previous-epoch';
|
||||||
import { chainIdQuery, statisticsQuery } from '@vegaprotocol/mock';
|
|
||||||
|
|
||||||
const guideLink = 'staking-guide-link';
|
const guideLink = 'staking-guide-link';
|
||||||
const validatorTitle = 'validator-node-title';
|
const validatorTitle = 'validator-node-title';
|
||||||
@@ -34,22 +33,11 @@ const overstakedPenaltyToolTip = 'overstaked-penalty-tooltip';
|
|||||||
const multisigPenaltyToolTip = 'multisig-error-tooltip';
|
const multisigPenaltyToolTip = 'multisig-error-tooltip';
|
||||||
const epochCountDown = 'epoch-countdown';
|
const epochCountDown = 'epoch-countdown';
|
||||||
const stakeNumberRegex = /^\d{1,3}(,\d{3})*(\.\d+)?$/;
|
const stakeNumberRegex = /^\d{1,3}(,\d{3})*(\.\d+)?$/;
|
||||||
const txTimeout = Cypress.env('txTimeout');
|
|
||||||
|
|
||||||
context('Validators Page - verify elements on page', function () {
|
context('Validators Page - verify elements on page', function () {
|
||||||
before('navigate to validators page', () => {
|
before('navigate to validators page', function () {
|
||||||
cy.mockGQL((req) => {
|
|
||||||
aliasGQLQuery(req, 'ChainId', chainIdQuery());
|
|
||||||
aliasGQLQuery(req, 'Statistics', statisticsQuery());
|
|
||||||
});
|
|
||||||
cy.visit('/validators');
|
cy.visit('/validators');
|
||||||
});
|
});
|
||||||
beforeEach(() => {
|
|
||||||
cy.mockGQL((req) => {
|
|
||||||
aliasGQLQuery(req, 'ChainId', chainIdQuery());
|
|
||||||
aliasGQLQuery(req, 'Statistics', statisticsQuery());
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('with wallets disconnected', { tags: '@smoke' }, function () {
|
describe('with wallets disconnected', { tags: '@smoke' }, function () {
|
||||||
it('Should have validators tab highlighted', function () {
|
it('Should have validators tab highlighted', function () {
|
||||||
@@ -189,11 +177,6 @@ context('Validators Page - verify elements on page', function () {
|
|||||||
{ tags: '@smoke' },
|
{ tags: '@smoke' },
|
||||||
function () {
|
function () {
|
||||||
before('connect wallets and click on validator', function () {
|
before('connect wallets and click on validator', function () {
|
||||||
cy.mockGQL((req) => {
|
|
||||||
aliasGQLQuery(req, 'ChainId', chainIdQuery());
|
|
||||||
aliasGQLQuery(req, 'Statistics', statisticsQuery());
|
|
||||||
});
|
|
||||||
cy.visit('/validators');
|
|
||||||
cy.connectVegaWallet();
|
cy.connectVegaWallet();
|
||||||
clickOnValidatorFromList(0);
|
clickOnValidatorFromList(0);
|
||||||
});
|
});
|
||||||
@@ -280,7 +263,7 @@ context('Validators Page - verify elements on page', function () {
|
|||||||
|
|
||||||
cy.getByTestId(epochCountDown).within(() => {
|
cy.getByTestId(epochCountDown).within(() => {
|
||||||
cy.get(epochTitle).should('not.be.empty');
|
cy.get(epochTitle).should('not.be.empty');
|
||||||
cy.get(nextEpochInfo, txTimeout).should('contain.text', 'Next epoch');
|
cy.get(nextEpochInfo).should('contain.text', 'Next epoch');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,8 +4,6 @@ import {
|
|||||||
vegaWalletFaucetAssetsWithoutCheck,
|
vegaWalletFaucetAssetsWithoutCheck,
|
||||||
vegaWalletTeardown,
|
vegaWalletTeardown,
|
||||||
} from '../../support/wallet-functions';
|
} from '../../support/wallet-functions';
|
||||||
import { aliasGQLQuery } from '@vegaprotocol/cypress';
|
|
||||||
import { chainIdQuery, statisticsQuery } from '@vegaprotocol/mock';
|
|
||||||
|
|
||||||
const walletContainer = 'aside [data-testid="vega-wallet"]';
|
const walletContainer = 'aside [data-testid="vega-wallet"]';
|
||||||
const walletHeader = '[data-testid="wallet-header"] h1';
|
const walletHeader = '[data-testid="wallet-header"] h1';
|
||||||
@@ -16,6 +14,10 @@ const dialogHeader = 'dialog-title';
|
|||||||
const walletDialogHeader = 'wallet-dialog-title';
|
const walletDialogHeader = 'wallet-dialog-title';
|
||||||
const connectorsList = 'connectors-list';
|
const connectorsList = 'connectors-list';
|
||||||
const dialogCloseBtn = 'dialog-close';
|
const dialogCloseBtn = 'dialog-close';
|
||||||
|
const restConnectorForm = 'rest-connector-form';
|
||||||
|
const restWallet = '#wallet';
|
||||||
|
const restPassphrase = '#passphrase';
|
||||||
|
const restConnectBtn = '[type="submit"]';
|
||||||
const accountNo = 'vega-account-truncated';
|
const accountNo = 'vega-account-truncated';
|
||||||
const currencyTitle = 'currency-title';
|
const currencyTitle = 'currency-title';
|
||||||
const currencyValue = 'currency-value';
|
const currencyValue = 'currency-value';
|
||||||
@@ -67,7 +69,7 @@ context(
|
|||||||
cy.get(dialog).within(() => {
|
cy.get(dialog).within(() => {
|
||||||
cy.getByTestId(walletDialogHeader)
|
cy.getByTestId(walletDialogHeader)
|
||||||
.should('be.visible')
|
.should('be.visible')
|
||||||
.and('have.text', 'Get a Vega wallet');
|
.and('have.text', 'Connect');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -75,7 +77,10 @@ context(
|
|||||||
cy.getByTestId(connectorsList).within(() => {
|
cy.getByTestId(connectorsList).within(() => {
|
||||||
cy.getByTestId('connector-jsonRpc')
|
cy.getByTestId('connector-jsonRpc')
|
||||||
.should('be.visible')
|
.should('be.visible')
|
||||||
.and('have.text', 'Use the Desktop App/CLI');
|
.and('have.text', 'Connect Vega wallet');
|
||||||
|
cy.getByTestId('connector-hosted')
|
||||||
|
.should('be.visible')
|
||||||
|
.and('have.text', 'Hosted Fairground wallet');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -86,14 +91,48 @@ context(
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('when rest connector form opened', function () {
|
||||||
|
before('click hosted wallet app button', function () {
|
||||||
|
cy.getByTestId(connectorsList).within(() => {
|
||||||
|
cy.getByTestId('connector-hosted').click();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// 0002-WCON-002
|
||||||
|
it('should have wallet field visible', function () {
|
||||||
|
cy.getByTestId(restConnectorForm).within(() => {
|
||||||
|
cy.get(restWallet).should('be.visible');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should have password field visible', function () {
|
||||||
|
cy.getByTestId(restConnectorForm).within(() => {
|
||||||
|
cy.get(restPassphrase).should('be.visible');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should have connect button visible', function () {
|
||||||
|
cy.getByTestId(restConnectorForm).within(() => {
|
||||||
|
cy.get(restConnectBtn)
|
||||||
|
.should('be.visible')
|
||||||
|
.and('have.text', 'Connect');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should have close button visible', function () {
|
||||||
|
cy.get(dialog).within(() => {
|
||||||
|
cy.getByTestId(dialogCloseBtn).should('be.visible');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
after('close dialog', function () {
|
||||||
|
cy.getByTestId(dialogCloseBtn).click().should('not.exist');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
describe('when vega wallet connected', function () {
|
describe('when vega wallet connected', function () {
|
||||||
before('connect vega wallet', function () {
|
before('connect vega wallet', function () {
|
||||||
cy.mockGQL((req) => {
|
|
||||||
aliasGQLQuery(req, 'ChainId', chainIdQuery());
|
|
||||||
aliasGQLQuery(req, 'Statistics', statisticsQuery());
|
|
||||||
});
|
|
||||||
cy.visit('/');
|
cy.visit('/');
|
||||||
cy.wait('@ChainId');
|
|
||||||
cy.connectVegaWallet();
|
cy.connectVegaWallet();
|
||||||
vegaWalletTeardown();
|
vegaWalletTeardown();
|
||||||
});
|
});
|
||||||
@@ -276,10 +315,6 @@ context(
|
|||||||
];
|
];
|
||||||
|
|
||||||
before('faucet assets to connected vega wallet', function () {
|
before('faucet assets to connected vega wallet', function () {
|
||||||
cy.mockGQL((req) => {
|
|
||||||
aliasGQLQuery(req, 'ChainId', chainIdQuery());
|
|
||||||
aliasGQLQuery(req, 'Statistics', statisticsQuery());
|
|
||||||
});
|
|
||||||
for (const { id, amount } of assets) {
|
for (const { id, amount } of assets) {
|
||||||
vegaWalletFaucetAssetsWithoutCheck(id, amount, vegaWalletPublicKey);
|
vegaWalletFaucetAssetsWithoutCheck(id, amount, vegaWalletPublicKey);
|
||||||
}
|
}
|
||||||
@@ -304,7 +339,7 @@ context(
|
|||||||
cy.getByTestId(vegaWalletCurrencyTitle)
|
cy.getByTestId(vegaWalletCurrencyTitle)
|
||||||
.contains(name)
|
.contains(name)
|
||||||
.parent()
|
.parent()
|
||||||
.siblings(txTimeout)
|
.siblings()
|
||||||
.should((elementAmount) => {
|
.should((elementAmount) => {
|
||||||
const displayedAmount = parseFloat(elementAmount.text());
|
const displayedAmount = parseFloat(elementAmount.text());
|
||||||
expect(displayedAmount).be.gte(expectedAmount);
|
expect(displayedAmount).be.gte(expectedAmount);
|
||||||
|
|||||||
@@ -107,7 +107,7 @@ export function dissociateFromSecondWalletKey() {
|
|||||||
cy.getByTestId('vega-in-wallet')
|
cy.getByTestId('vega-in-wallet')
|
||||||
.first()
|
.first()
|
||||||
.within(() => {
|
.within(() => {
|
||||||
cy.getByTestId('eth-wallet-associated-balances', txTimeout)
|
cy.getByTestId('eth-wallet-associated-balances')
|
||||||
.last()
|
.last()
|
||||||
.within(() => {
|
.within(() => {
|
||||||
cy.getByTestId('associated-key')
|
cy.getByTestId('associated-key')
|
||||||
|
|||||||
@@ -232,23 +232,6 @@ export function getDownloadedProposalJsonPath(proposalType: string) {
|
|||||||
return filepath;
|
return filepath;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function validateProposalDetailsDiff(
|
|
||||||
RowName: string,
|
|
||||||
changeType: proposalChangeType,
|
|
||||||
newValue: string,
|
|
||||||
oldValue?: string
|
|
||||||
) {
|
|
||||||
cy.contains(RowName)
|
|
||||||
.parentsUntil(proposalInformationTableRows)
|
|
||||||
.parent()
|
|
||||||
.first()
|
|
||||||
.within(() => {
|
|
||||||
cy.contains(changeType).should('be.visible');
|
|
||||||
cy.contains(newValue).should('be.visible');
|
|
||||||
if (oldValue) cy.contains(oldValue).should('have.class', 'line-through');
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function getFormattedTime() {
|
function getFormattedTime() {
|
||||||
const now = new Date();
|
const now = new Date();
|
||||||
const day = now.getDate().toString().padStart(2, '0');
|
const day = now.getDate().toString().padStart(2, '0');
|
||||||
@@ -269,8 +252,3 @@ export enum governanceProposalType {
|
|||||||
FREEFORM = 'Freeform',
|
FREEFORM = 'Freeform',
|
||||||
RAW = 'raw proposal',
|
RAW = 'raw proposal',
|
||||||
}
|
}
|
||||||
|
|
||||||
export enum proposalChangeType {
|
|
||||||
UPDATED = 'Updated',
|
|
||||||
ADDED = 'Added',
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -211,143 +211,6 @@ export function createNewMarketProposalTxBody(): ProposalSubmissionBody {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
// Requires cy.createMarket() to be run to set up parent market
|
|
||||||
export function createSuccessorMarketProposalTxBody(
|
|
||||||
parentMarketId: string
|
|
||||||
): ProposalSubmissionBody {
|
|
||||||
const MIN_CLOSE_SEC = 10000;
|
|
||||||
const MIN_ENACT_SEC = 10000;
|
|
||||||
|
|
||||||
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());
|
|
||||||
return {
|
|
||||||
proposalSubmission: {
|
|
||||||
rationale: {
|
|
||||||
title: 'Test successor market proposal details',
|
|
||||||
description: 'E2E test for successor market',
|
|
||||||
},
|
|
||||||
terms: {
|
|
||||||
newMarket: {
|
|
||||||
changes: {
|
|
||||||
decimalPlaces: '5',
|
|
||||||
positionDecimalPlaces: '5',
|
|
||||||
linearSlippageFactor: '0.001',
|
|
||||||
quadraticSlippageFactor: '0',
|
|
||||||
lpPriceRange: '10',
|
|
||||||
instrument: {
|
|
||||||
name: 'Token test market',
|
|
||||||
code: 'TEST.24h',
|
|
||||||
future: {
|
|
||||||
settlementAsset:
|
|
||||||
'816af99af60d684502a40824758f6b5377e6af48e50a9ee8ef478ecb879ea8bc',
|
|
||||||
quoteName: 'fUSDC',
|
|
||||||
dataSourceSpecForSettlementData: {
|
|
||||||
external: {
|
|
||||||
oracle: {
|
|
||||||
signers: [
|
|
||||||
{
|
|
||||||
pubKey: {
|
|
||||||
key: '70d14a321e02e71992fd115563df765000ccc4775cbe71a0e2f9ff5a3b9dc680',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
],
|
|
||||||
filters: [
|
|
||||||
{
|
|
||||||
key: {
|
|
||||||
name: 'prices.BTC.value',
|
|
||||||
type: 'TYPE_INTEGER' as const,
|
|
||||||
numberDecimalPlaces: '0',
|
|
||||||
},
|
|
||||||
conditions: [
|
|
||||||
{
|
|
||||||
operator: 'OPERATOR_GREATER_THAN' as const,
|
|
||||||
value: '0',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
dataSourceSpecForTradingTermination: {
|
|
||||||
external: {
|
|
||||||
oracle: {
|
|
||||||
signers: [
|
|
||||||
{
|
|
||||||
pubKey: {
|
|
||||||
key: '70d14a321e02e71992fd115563df765000ccc4775cbe71a0e2f9ff5a3b9dc680',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
],
|
|
||||||
filters: [
|
|
||||||
{
|
|
||||||
key: {
|
|
||||||
name: 'trading.terminated.ETH5',
|
|
||||||
type: 'TYPE_BOOLEAN' as const,
|
|
||||||
},
|
|
||||||
conditions: [
|
|
||||||
{
|
|
||||||
operator: 'OPERATOR_EQUALS' as const,
|
|
||||||
value: 'true',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
dataSourceSpecBinding: {
|
|
||||||
settlementDataProperty: 'prices.BTC.value',
|
|
||||||
tradingTerminationProperty: 'trading.terminated.ETH5',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
metadata: [
|
|
||||||
'sector:food',
|
|
||||||
'sector:materials',
|
|
||||||
'source:docs.vega.xyz',
|
|
||||||
],
|
|
||||||
priceMonitoringParameters: {
|
|
||||||
triggers: [
|
|
||||||
{
|
|
||||||
horizon: '43200',
|
|
||||||
probability: '0.9999999',
|
|
||||||
auctionExtension: '600',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
liquidityMonitoringParameters: {
|
|
||||||
targetStakeParameters: {
|
|
||||||
timeWindow: '3600',
|
|
||||||
scalingFactor: 10,
|
|
||||||
},
|
|
||||||
triggeringRatio: '0.7',
|
|
||||||
auctionExtension: '1',
|
|
||||||
},
|
|
||||||
logNormal: {
|
|
||||||
tau: 0.0001140771161,
|
|
||||||
riskAversionParameter: 0.01,
|
|
||||||
params: {
|
|
||||||
mu: 0,
|
|
||||||
r: 0.016,
|
|
||||||
sigma: 0.5,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
successor: {
|
|
||||||
parentMarketId: parentMarketId,
|
|
||||||
insurancePoolFraction: '0.75',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
closingTimestamp,
|
|
||||||
enactmentTimestamp,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
export function mockNetworkUpgradeProposal() {
|
export function mockNetworkUpgradeProposal() {
|
||||||
cy.mockGQL((req) => {
|
cy.mockGQL((req) => {
|
||||||
aliasGQLQuery(req, 'Nodes', nodeData);
|
aliasGQLQuery(req, 'Nodes', nodeData);
|
||||||
|
|||||||
@@ -78,21 +78,13 @@ export function stakingPageAssociateTokens(
|
|||||||
}
|
}
|
||||||
cy.get(tokenAmountInputBox, epochTimeout).type(amount);
|
cy.get(tokenAmountInputBox, epochTimeout).type(amount);
|
||||||
if (approve) {
|
if (approve) {
|
||||||
cy.getByTestId('wallet-associate').then((walletAssociateField) => {
|
cy.get(tokenInputApprove, txTimeout).should('be.enabled').click();
|
||||||
if (
|
cy.contains('Approve $VEGA Tokens for staking on Vega').should(
|
||||||
walletAssociateField.find('[data-testid="token-input-approve-button"]')
|
'be.visible'
|
||||||
.length
|
);
|
||||||
) {
|
cy.contains('Approve $VEGA Tokens for staking on Vega', txTimeout).should(
|
||||||
cy.get(tokenInputApprove, txTimeout).should('be.enabled').click();
|
'not.exist'
|
||||||
cy.contains('Approve $VEGA Tokens for staking on Vega').should(
|
);
|
||||||
'be.visible'
|
|
||||||
);
|
|
||||||
cy.contains(
|
|
||||||
'Approve $VEGA Tokens for staking on Vega',
|
|
||||||
txTimeout
|
|
||||||
).should('not.exist');
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
cy.get(tokenSubmitButton, txTimeout).should('be.enabled').click();
|
cy.get(tokenSubmitButton, txTimeout).should('be.enabled').click();
|
||||||
|
|
||||||
@@ -182,8 +174,7 @@ export function clickOnValidatorFromList(
|
|||||||
cy.get(`[row-id="${validatorNumber}"]`)
|
cy.get(`[row-id="${validatorNumber}"]`)
|
||||||
.should('be.visible')
|
.should('be.visible')
|
||||||
.find(stakeValidatorListName)
|
.find(stakeValidatorListName)
|
||||||
.as('validatorOnList');
|
.click();
|
||||||
cy.get('@validatorOnList').click();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -9,7 +9,6 @@ NX_VEGA_NETWORKS='{"DEVNET":"https://dev.governance.vega.xyz","STAGNET1":"https:
|
|||||||
NX_GITHUB_FEEDBACK_URL=https://github.com/vegaprotocol/feedback/discussions
|
NX_GITHUB_FEEDBACK_URL=https://github.com/vegaprotocol/feedback/discussions
|
||||||
NX_VEGA_WALLET_URL=http://localhost:1789
|
NX_VEGA_WALLET_URL=http://localhost:1789
|
||||||
NX_VEGA_EXPLORER_URL=https://explorer.stagnet1.vega.rocks
|
NX_VEGA_EXPLORER_URL=https://explorer.stagnet1.vega.rocks
|
||||||
NX_ORACLE_PROOFS_URL=https://raw.githubusercontent.com/vegaprotocol/well-known/main/__generated__/oracle-proofs.json
|
|
||||||
|
|
||||||
NX_HOSTED_WALLET_URL=https://wallet.testnet.vega.xyz
|
NX_HOSTED_WALLET_URL=https://wallet.testnet.vega.xyz
|
||||||
NX_VEGA_DOCS_URL=https://docs.vega.xyz/testnet
|
NX_VEGA_DOCS_URL=https://docs.vega.xyz/testnet
|
||||||
@@ -19,15 +18,6 @@ NX_ANNOUNCEMENTS_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/annou
|
|||||||
NX_WALLETCONNECT_PROJECT_ID=fe8091dc35738863e509fc4947525c72
|
NX_WALLETCONNECT_PROJECT_ID=fe8091dc35738863e509fc4947525c72
|
||||||
NX_VEGA_REST_URL=https://api.n00.stagnet1.vega.xyz/api/v2/
|
NX_VEGA_REST_URL=https://api.n00.stagnet1.vega.xyz/api/v2/
|
||||||
|
|
||||||
NX_TENDERMINT_URL=https://tm.n01.stagnet1.vega.rocks
|
|
||||||
NX_TENDERMINT_WEBSOCKET_URL=wss://tm.n01.stagnet1.vega.xyz/websocket
|
|
||||||
|
|
||||||
NX_CHROME_EXTENSION_URL=https://chrome.google.com/webstore/detail/vega-wallet-fairground/nmmjkiafpmphlikhefgjbblebfgclikn
|
|
||||||
NX_MOZILLA_EXTENSION_URL=https://addons.mozilla.org/pl/firefox/addon/vega-wallet
|
|
||||||
|
|
||||||
#Test configuration variables
|
#Test configuration variables
|
||||||
CYPRESS_FAIRGROUND=false
|
CYPRESS_FAIRGROUND=false
|
||||||
LC_ALL="en_US.UTF-8"
|
LC_ALL="en_US.UTF-8"
|
||||||
|
|
||||||
# Cosmic elevator flags
|
|
||||||
NX_SUCCESSOR_MARKETS=true
|
|
||||||
|
|||||||
@@ -19,11 +19,6 @@ NX_DELEGATIONS_PAGINATION=50
|
|||||||
NX_TRANCHES_SERVICE_URL=https://tranches-stagnet1-k8s.ops.vega.xyz
|
NX_TRANCHES_SERVICE_URL=https://tranches-stagnet1-k8s.ops.vega.xyz
|
||||||
NX_VEGA_REST_URL=http://localhost:3008/api/v2/
|
NX_VEGA_REST_URL=http://localhost:3008/api/v2/
|
||||||
|
|
||||||
NX_TENDERMINT_URL=http://localhost:26617
|
|
||||||
NX_TENDERMINT_WEBSOCKET_URL=wss://localhost:26617/websocket
|
|
||||||
|
|
||||||
#Test configuration variables
|
#Test configuration variables
|
||||||
CYPRESS_FAIRGROUND=false
|
CYPRESS_FAIRGROUND=false
|
||||||
|
|
||||||
# Cosmic elevator flags
|
|
||||||
NX_SUCCESSOR_MARKETS=false
|
|
||||||
@@ -13,9 +13,3 @@ NX_TRANCHES_SERVICE_URL=https://tranches-devnet1-k8s.ops.vega.xyz
|
|||||||
NX_ANNOUNCEMENTS_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/announcements/fairground/announcements.json
|
NX_ANNOUNCEMENTS_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/announcements/fairground/announcements.json
|
||||||
NX_VEGA_REST_URL=https://api.n00.devnet1.vega.xyz/api/v2/
|
NX_VEGA_REST_URL=https://api.n00.devnet1.vega.xyz/api/v2/
|
||||||
NX_SENTRY_DSN=https://4b8c8a8ba07742648aa4dfe1b8d17e40@o286262.ingest.sentry.io/5882996
|
NX_SENTRY_DSN=https://4b8c8a8ba07742648aa4dfe1b8d17e40@o286262.ingest.sentry.io/5882996
|
||||||
|
|
||||||
NX_TENDERMINT_URL=https://tm.be.devnet1.vega.xyz/
|
|
||||||
NX_TENDERMINT_WEBSOCKET_URL=wss://be.devnet1.vega.xyz/websocket
|
|
||||||
|
|
||||||
# Cosmic elevator flags
|
|
||||||
NX_SUCCESSOR_MARKETS=true
|
|
||||||
@@ -14,9 +14,3 @@ NX_DELEGATIONS_PAGINATION=50
|
|||||||
NX_TRANCHES_SERVICE_URL=https://tranches-mainnet-k8s.ops.vega.xyz
|
NX_TRANCHES_SERVICE_URL=https://tranches-mainnet-k8s.ops.vega.xyz
|
||||||
NX_ANNOUNCEMENTS_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/announcements/mainnet/announcements.json
|
NX_ANNOUNCEMENTS_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/announcements/mainnet/announcements.json
|
||||||
NX_VEGA_REST_URL=https://api.vega.community/api/v2/
|
NX_VEGA_REST_URL=https://api.vega.community/api/v2/
|
||||||
|
|
||||||
NX_TENDERMINT_URL=https://be.vega.community
|
|
||||||
NX_TENDERMINT_WEBSOCKET_URL=wss://be.vega.community/websocket
|
|
||||||
|
|
||||||
# Cosmic elevator flags
|
|
||||||
NX_SUCCESSOR_MARKETS=false
|
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
# App configuration variables
|
# App configuration variables
|
||||||
NX_VEGA_ENV=MAINNET_MIRROR
|
NX_VEGA_ENV=MAINNET-MIRROR
|
||||||
NX_VEGA_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/networks-internal/main/mainnet-mirror/vegawallet-mainnet-mirror.toml
|
NX_VEGA_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/networks-internal/main/mainnet-mirror/vegawallet-mainnet-mirror.toml
|
||||||
NX_VEGA_URL=https://api.mainnet-mirror.vega.rocks/graphql
|
NX_VEGA_URL=https://api.mainnet-mirror.vega.rocks/graphql
|
||||||
NX_VEGA_NETWORKS='{"DEVNET":"https://dev.governance.vega.xyz","TESTNET":"https://governance.fairground.wtf","MAINNET":"https://governance.vega.xyz","MAINNET_MIRROR":"https://governance.mainnet-mirror.vega.rocks","STAGNET1":"https://trading.stagnet1.vega.rocks"}'
|
NX_VEGA_NETWORKS='{"DEVNET":"https://dev.governance.vega.xyz","TESTNET":"https://governance.fairground.wtf","MAINNET":"https://governance.vega.xyz","MAINNET-MIRROR":"https://governance.mainnet-mirror.vega.rocks","STAGNET1":"https://trading.stagnet1.vega.rocks"}'
|
||||||
NX_ETHEREUM_PROVIDER_URL=https://sepolia.infura.io/v3/4f846e79e13f44d1b51bbd7ed9edefb8
|
NX_ETHEREUM_PROVIDER_URL=https://sepolia.infura.io/v3/4f846e79e13f44d1b51bbd7ed9edefb8
|
||||||
NX_ETHERSCAN_URL=https://sepolia.etherscan.io
|
NX_ETHERSCAN_URL=https://sepolia.etherscan.io
|
||||||
NX_GITHUB_FEEDBACK_URL=https://github.com/vegaprotocol/feedback/discussions
|
NX_GITHUB_FEEDBACK_URL=https://github.com/vegaprotocol/feedback/discussions
|
||||||
@@ -13,9 +13,3 @@ NX_DELEGATIONS_PAGINATION=50
|
|||||||
NX_TRANCHES_SERVICE_URL=https://tranches-mainnet-mirror-k8s.ops.vega.xyz
|
NX_TRANCHES_SERVICE_URL=https://tranches-mainnet-mirror-k8s.ops.vega.xyz
|
||||||
NX_ANNOUNCEMENTS_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/announcements/mainnet/announcements.json
|
NX_ANNOUNCEMENTS_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/announcements/mainnet/announcements.json
|
||||||
NX_VEGA_REST_URL=https://api.mainnet-mirror.vega.rocks/api/v2/
|
NX_VEGA_REST_URL=https://api.mainnet-mirror.vega.rocks/api/v2/
|
||||||
|
|
||||||
NX_TENDERMINT_URL=https://be.mainnet-mirror.vega.rocks
|
|
||||||
NX_TENDERMINT_WEBSOCKET_URL=wss://be.mainnet-mirror.vega.rocks/websocket
|
|
||||||
|
|
||||||
# Cosmic elevator flags
|
|
||||||
NX_SUCCESSOR_MARKETS=false
|
|
||||||
@@ -9,9 +9,3 @@ NX_DELEGATIONS_PAGINATION=50
|
|||||||
NX_TRANCHES_SERVICE_URL=https://tranches-stagnet1-k8s.ops.vega.xyz
|
NX_TRANCHES_SERVICE_URL=https://tranches-stagnet1-k8s.ops.vega.xyz
|
||||||
NX_ANNOUNCEMENTS_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/announcements/fairground/announcements.json
|
NX_ANNOUNCEMENTS_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/announcements/fairground/announcements.json
|
||||||
NX_VEGA_REST_URL=https://api.n00.stagnet1.vega.xyz/api/v2/
|
NX_VEGA_REST_URL=https://api.n00.stagnet1.vega.xyz/api/v2/
|
||||||
|
|
||||||
NX_TENDERMINT_URL=https://tm.n01.stagnet1.vega.rocks
|
|
||||||
NX_TENDERMINT_WEBSOCKET_URL=wss://tm.n01.stagnet1.vega.xyz/websocket
|
|
||||||
|
|
||||||
# Cosmic elevator flags
|
|
||||||
NX_SUCCESSOR_MARKETS=true
|
|
||||||
@@ -14,9 +14,3 @@ NX_TRANCHES_SERVICE_URL=https://tranches-testnet-k8s.ops.vega.xyz
|
|||||||
NX_ANNOUNCEMENTS_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/announcements/fairground/announcements.json
|
NX_ANNOUNCEMENTS_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/announcements/fairground/announcements.json
|
||||||
NX_VEGA_REST_URL=https://api.n07.testnet.vega.xyz/api/v2/
|
NX_VEGA_REST_URL=https://api.n07.testnet.vega.xyz/api/v2/
|
||||||
NX_SENTRY_DSN=https://4b8c8a8ba07742648aa4dfe1b8d17e40@o286262.ingest.sentry.io/5882996
|
NX_SENTRY_DSN=https://4b8c8a8ba07742648aa4dfe1b8d17e40@o286262.ingest.sentry.io/5882996
|
||||||
|
|
||||||
NX_TENDERMINT_URL=https://tm.be.testnet.vega.xyz
|
|
||||||
NX_TENDERMINT_WEBSOCKET_URL=wss://be.testnet.vega.xyz/websocket
|
|
||||||
|
|
||||||
# Cosmic elevator flags
|
|
||||||
NX_SUCCESSOR_MARKETS=true
|
|
||||||
@@ -11,9 +11,3 @@ NX_VEGA_EXPLORER_URL=https://explorer.validators-testnet.vega.rocks/
|
|||||||
NX_ANNOUNCEMENTS_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/announcements/fairground/announcements.json
|
NX_ANNOUNCEMENTS_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/announcements/fairground/announcements.json
|
||||||
NX_VEGA_REST_URL=https://api-validators-testnet.vega.rocks/api/v2/
|
NX_VEGA_REST_URL=https://api-validators-testnet.vega.rocks/api/v2/
|
||||||
NX_SENTRY_DSN=https://4b8c8a8ba07742648aa4dfe1b8d17e40@o286262.ingest.sentry.io/5882996
|
NX_SENTRY_DSN=https://4b8c8a8ba07742648aa4dfe1b8d17e40@o286262.ingest.sentry.io/5882996
|
||||||
|
|
||||||
NX_TENDERMINT_URL=https://tm.be.validators-testnet.vega.rocks
|
|
||||||
NX_TENDERMINT_WEBSOCKET_URL=wss://be.validators-testnet.vega.
|
|
||||||
|
|
||||||
# Cosmic elevator flags
|
|
||||||
NX_SUCCESSOR_MARKETS=false
|
|
||||||
@@ -2,13 +2,14 @@ import * as Sentry from '@sentry/react';
|
|||||||
import { toBigNum } from '@vegaprotocol/utils';
|
import { toBigNum } from '@vegaprotocol/utils';
|
||||||
import { Splash } from '@vegaprotocol/ui-toolkit';
|
import { Splash } from '@vegaprotocol/ui-toolkit';
|
||||||
import { useVegaWallet, useEagerConnect } from '@vegaprotocol/wallet';
|
import { useVegaWallet, useEagerConnect } from '@vegaprotocol/wallet';
|
||||||
import { FLAGS, useEnvironment } from '@vegaprotocol/environment';
|
import { useEnvironment } from '@vegaprotocol/environment';
|
||||||
import { useWeb3React } from '@web3-react/core';
|
import { useWeb3React } from '@web3-react/core';
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { useTranslation } from 'react-i18next';
|
import { useTranslation } from 'react-i18next';
|
||||||
|
|
||||||
import { SplashError } from './components/splash-error';
|
import { SplashError } from './components/splash-error';
|
||||||
import { SplashLoader } from './components/splash-loader';
|
import { SplashLoader } from './components/splash-loader';
|
||||||
|
import { Flags } from './config';
|
||||||
import {
|
import {
|
||||||
AppStateActionType,
|
AppStateActionType,
|
||||||
useAppState,
|
useAppState,
|
||||||
@@ -79,7 +80,7 @@ export const AppLoader = ({ children }: { children: React.ReactElement }) => {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
if (!FLAGS.GOVERNANCE_NETWORK_DOWN) {
|
if (!Flags.NETWORK_DOWN) {
|
||||||
run();
|
run();
|
||||||
}
|
}
|
||||||
}, [token, appDispatch, staking, vesting]);
|
}, [token, appDispatch, staking, vesting]);
|
||||||
@@ -147,7 +148,7 @@ export const AppLoader = ({ children }: { children: React.ReactElement }) => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Only begin polling if network limits flag is set, as this is a new API not yet on mainnet 7/3/22
|
// Only begin polling if network limits flag is set, as this is a new API not yet on mainnet 7/3/22
|
||||||
if (FLAGS.GOVERNANCE_NETWORK_LIMITS) {
|
if (Flags.NETWORK_LIMITS) {
|
||||||
getNetworkLimits();
|
getNetworkLimits();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -156,7 +157,7 @@ export const AppLoader = ({ children }: { children: React.ReactElement }) => {
|
|||||||
};
|
};
|
||||||
}, [appDispatch, VEGA_URL, t]);
|
}, [appDispatch, VEGA_URL, t]);
|
||||||
|
|
||||||
if (FLAGS.GOVERNANCE_NETWORK_DOWN) {
|
if (Flags.NETWORK_DOWN) {
|
||||||
return (
|
return (
|
||||||
<Splash>
|
<Splash>
|
||||||
<SplashError />
|
<SplashError />
|
||||||
|
|||||||
@@ -2,8 +2,13 @@ import { Button } from '@vegaprotocol/ui-toolkit';
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { useTranslation } from 'react-i18next';
|
import { useTranslation } from 'react-i18next';
|
||||||
import { useVegaWalletDialogStore } from '@vegaprotocol/wallet';
|
import { useVegaWalletDialogStore } from '@vegaprotocol/wallet';
|
||||||
|
import {
|
||||||
|
AppStateActionType,
|
||||||
|
useAppState,
|
||||||
|
} from '../../contexts/app-state/app-state-context';
|
||||||
|
|
||||||
export const ConnectToVega = () => {
|
export const ConnectToVega = () => {
|
||||||
|
const { appDispatch } = useAppState();
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
const { openVegaWalletDialog } = useVegaWalletDialogStore((store) => ({
|
const { openVegaWalletDialog } = useVegaWalletDialogStore((store) => ({
|
||||||
openVegaWalletDialog: store.openVegaWalletDialog,
|
openVegaWalletDialog: store.openVegaWalletDialog,
|
||||||
@@ -11,6 +16,10 @@ export const ConnectToVega = () => {
|
|||||||
return (
|
return (
|
||||||
<Button
|
<Button
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
|
appDispatch({
|
||||||
|
type: AppStateActionType.SET_VEGA_WALLET_OVERLAY,
|
||||||
|
isOpen: true,
|
||||||
|
});
|
||||||
openVegaWalletDialog();
|
openVegaWalletDialog();
|
||||||
}}
|
}}
|
||||||
data-testid="connect-to-vega-wallet-btn"
|
data-testid="connect-to-vega-wallet-btn"
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
export * from './json-diff';
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
import { render, screen, cleanup } from '@testing-library/react';
|
|
||||||
import { JsonDiff } from './json-diff';
|
|
||||||
|
|
||||||
describe('JsonDiff', () => {
|
|
||||||
afterEach(cleanup);
|
|
||||||
|
|
||||||
it('renders without crashing', () => {
|
|
||||||
render(<JsonDiff left={{}} right={{}} />);
|
|
||||||
expect(screen.getByTestId('json-diff')).toBeInTheDocument();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('shows the correct message when both objects are identical', () => {
|
|
||||||
render(<JsonDiff left={{}} right={{}} />);
|
|
||||||
expect(screen.getByText('Data is identical')).toBeInTheDocument();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('does not show the "identical" message when both objects are not identical', () => {
|
|
||||||
render(
|
|
||||||
<JsonDiff
|
|
||||||
left={{
|
|
||||||
name: 'test',
|
|
||||||
}}
|
|
||||||
right={{
|
|
||||||
name: 'test2',
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
);
|
|
||||||
expect(screen.queryByText('Data is identical')).not.toBeInTheDocument();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
@@ -1,46 +0,0 @@
|
|||||||
import { useState, useEffect } from 'react';
|
|
||||||
import { useTranslation } from 'react-i18next';
|
|
||||||
import { formatters, create } from 'jsondiffpatch';
|
|
||||||
import 'jsondiffpatch/dist/formatters-styles/html.css';
|
|
||||||
import 'jsondiffpatch/dist/formatters-styles/annotated.css';
|
|
||||||
|
|
||||||
export type JsonValue =
|
|
||||||
| string
|
|
||||||
| number
|
|
||||||
| boolean
|
|
||||||
| null
|
|
||||||
| JsonValue[]
|
|
||||||
| { [key: string]: JsonValue };
|
|
||||||
|
|
||||||
interface JsonDiffProps {
|
|
||||||
left: JsonValue;
|
|
||||||
right: JsonValue;
|
|
||||||
objectHash?: (obj: unknown) => string | undefined;
|
|
||||||
}
|
|
||||||
|
|
||||||
export const JsonDiff = ({ right, left, objectHash }: JsonDiffProps) => {
|
|
||||||
const { t } = useTranslation();
|
|
||||||
const [html, setHtml] = useState<string | undefined>();
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
const delta = create({
|
|
||||||
objectHash,
|
|
||||||
}).diff(left, right);
|
|
||||||
|
|
||||||
if (delta) {
|
|
||||||
const deltaHtml = formatters.html.format(delta, left);
|
|
||||||
|
|
||||||
formatters.html.hideUnchanged();
|
|
||||||
|
|
||||||
setHtml(deltaHtml);
|
|
||||||
} else {
|
|
||||||
setHtml(undefined);
|
|
||||||
}
|
|
||||||
}, [right, left, objectHash]);
|
|
||||||
|
|
||||||
return html ? (
|
|
||||||
<div data-testid="json-diff" dangerouslySetInnerHTML={{ __html: html }} />
|
|
||||||
) : (
|
|
||||||
<p data-testid="json-diff">{t('dataIsIdentical')}</p>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
@@ -18,7 +18,6 @@ import { VegaWallet } from '../vega-wallet';
|
|||||||
import { useLocation, useMatch } from 'react-router-dom';
|
import { useLocation, useMatch } from 'react-router-dom';
|
||||||
import { useEffect } from 'react';
|
import { useEffect } from 'react';
|
||||||
import { useTelemetryDialog } from '../telemetry-dialog/telemetry-dialog';
|
import { useTelemetryDialog } from '../telemetry-dialog/telemetry-dialog';
|
||||||
import { ProtocolUpgradeCountdown } from '@vegaprotocol/proposals';
|
|
||||||
|
|
||||||
export const SettingsLink = () => {
|
export const SettingsLink = () => {
|
||||||
const { open, isOpen, close } = useTelemetryDialog();
|
const { open, isOpen, close } = useTelemetryDialog();
|
||||||
@@ -62,12 +61,7 @@ export const Nav = ({ theme }: Pick<NavigationProps, 'theme'>) => {
|
|||||||
appName="Governance"
|
appName="Governance"
|
||||||
theme={theme}
|
theme={theme}
|
||||||
breakpoints={[458, 959]}
|
breakpoints={[458, 959]}
|
||||||
actions={
|
actions={<SettingsLink />}
|
||||||
<>
|
|
||||||
<SettingsLink />
|
|
||||||
<ProtocolUpgradeCountdown />
|
|
||||||
</>
|
|
||||||
}
|
|
||||||
>
|
>
|
||||||
<NavigationList
|
<NavigationList
|
||||||
className="[.drawer-content_&]:border-b [.drawer-content_&]:border-b-vega-light-200 dark:[.drawer-content_&]:border-b-vega-dark-200 [.drawer-content_&]:pb-8 [.drawer-content_&]:mb-2"
|
className="[.drawer-content_&]:border-b [.drawer-content_&]:border-b-vega-light-200 dark:[.drawer-content_&]:border-b-vega-dark-200 [.drawer-content_&]:pb-8 [.drawer-content_&]:mb-2"
|
||||||
|
|||||||
@@ -4,11 +4,7 @@ import type { ReactNode } from 'react';
|
|||||||
import { AnnouncementBanner } from '@vegaprotocol/announcements';
|
import { AnnouncementBanner } from '@vegaprotocol/announcements';
|
||||||
import { Nav } from '../nav';
|
import { Nav } from '../nav';
|
||||||
import { Networks, useEnvironment } from '@vegaprotocol/environment';
|
import { Networks, useEnvironment } from '@vegaprotocol/environment';
|
||||||
import {
|
import React from 'react';
|
||||||
ProtocolUpgradeCountdownMode,
|
|
||||||
ProtocolUpgradeProposalNotification,
|
|
||||||
} from '@vegaprotocol/proposals';
|
|
||||||
import { ViewingAsBanner } from '@vegaprotocol/ui-toolkit';
|
|
||||||
|
|
||||||
interface AppLayoutProps {
|
interface AppLayoutProps {
|
||||||
children: ReactNode;
|
children: ReactNode;
|
||||||
@@ -35,23 +31,8 @@ export const AppLayout = ({ children }: AppLayoutProps) => {
|
|||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
<Nav theme={VEGA_ENV === Networks.TESTNET ? 'yellow' : 'dark'} />
|
<Nav theme={VEGA_ENV === Networks.TESTNET ? 'yellow' : 'dark'} />
|
||||||
<NotificationsContainer />
|
|
||||||
</div>
|
</div>
|
||||||
<div className={AppLayoutClasses}>{children}</div>
|
<div className={AppLayoutClasses}>{children}</div>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
const NotificationsContainer = () => {
|
|
||||||
const { isReadOnly, pubKey, disconnect } = useVegaWallet();
|
|
||||||
return (
|
|
||||||
<div data-testid="banners">
|
|
||||||
<ProtocolUpgradeProposalNotification
|
|
||||||
mode={ProtocolUpgradeCountdownMode.IN_ESTIMATED_TIME_REMAINING}
|
|
||||||
/>
|
|
||||||
{isReadOnly ? (
|
|
||||||
<ViewingAsBanner pubKey={pubKey} disconnect={disconnect} />
|
|
||||||
) : null}
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
import { ViewingAsBanner } from '@vegaprotocol/ui-toolkit';
|
||||||
|
import { useVegaWallet } from '@vegaprotocol/wallet';
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
|
|
||||||
export interface TemplateSidebarProps {
|
export interface TemplateSidebarProps {
|
||||||
@@ -6,18 +8,24 @@ export interface TemplateSidebarProps {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export function TemplateSidebar({ children, sidebar }: TemplateSidebarProps) {
|
export function TemplateSidebar({ children, sidebar }: TemplateSidebarProps) {
|
||||||
|
const { isReadOnly, pubKey, disconnect } = useVegaWallet();
|
||||||
return (
|
return (
|
||||||
<div className="w-full border-b border-neutral-700 lg:grid lg:grid-rows-[1fr] lg:grid-cols-[1fr_450px]">
|
<>
|
||||||
<main className="max-w-[100vw] col-start-1 p-4 overflow-auto">
|
{isReadOnly ? (
|
||||||
{children}
|
<ViewingAsBanner pubKey={pubKey} disconnect={disconnect} />
|
||||||
</main>
|
) : null}
|
||||||
<aside className="col-start-2 row-start-1 row-span-2 hidden lg:block p-4 bg-banner bg-contain border-l border-neutral-700">
|
<div className="w-full border-b border-neutral-700 lg:grid lg:grid-rows-[1fr] lg:grid-cols-[1fr_450px]">
|
||||||
{sidebar.map((Component, i) => (
|
<main className="max-w-[100vw] col-start-1 p-4 overflow-auto">
|
||||||
<section className="mb-4 last:mb-0" key={i}>
|
{children}
|
||||||
{Component}
|
</main>
|
||||||
</section>
|
<aside className="col-start-2 row-start-1 row-span-2 hidden lg:block p-4 bg-banner bg-contain border-l border-neutral-700">
|
||||||
))}
|
{sidebar.map((Component, i) => (
|
||||||
</aside>
|
<section className="mb-4 last:mb-0" key={i}>
|
||||||
</div>
|
{Component}
|
||||||
|
</section>
|
||||||
|
))}
|
||||||
|
</aside>
|
||||||
|
</div>
|
||||||
|
</>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,11 @@ import { useVegaWallet, useVegaWalletDialogStore } from '@vegaprotocol/wallet';
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { useTranslation } from 'react-i18next';
|
import { useTranslation } from 'react-i18next';
|
||||||
|
|
||||||
|
import {
|
||||||
|
AppStateActionType,
|
||||||
|
useAppState,
|
||||||
|
} from '../../contexts/app-state/app-state-context';
|
||||||
|
|
||||||
interface VegaWalletContainerProps {
|
interface VegaWalletContainerProps {
|
||||||
children: (key: string) => React.ReactElement;
|
children: (key: string) => React.ReactElement;
|
||||||
}
|
}
|
||||||
@@ -10,6 +15,7 @@ interface VegaWalletContainerProps {
|
|||||||
export const VegaWalletContainer = ({ children }: VegaWalletContainerProps) => {
|
export const VegaWalletContainer = ({ children }: VegaWalletContainerProps) => {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
const { pubKey } = useVegaWallet();
|
const { pubKey } = useVegaWallet();
|
||||||
|
const { appDispatch } = useAppState();
|
||||||
const { openVegaWalletDialog } = useVegaWalletDialogStore((store) => ({
|
const { openVegaWalletDialog } = useVegaWalletDialogStore((store) => ({
|
||||||
openVegaWalletDialog: store.openVegaWalletDialog,
|
openVegaWalletDialog: store.openVegaWalletDialog,
|
||||||
}));
|
}));
|
||||||
@@ -19,6 +25,10 @@ export const VegaWalletContainer = ({ children }: VegaWalletContainerProps) => {
|
|||||||
<Button
|
<Button
|
||||||
data-testid="connect-to-vega-wallet-btn"
|
data-testid="connect-to-vega-wallet-btn"
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
|
appDispatch({
|
||||||
|
type: AppStateActionType.SET_VEGA_WALLET_OVERLAY,
|
||||||
|
isOpen: true,
|
||||||
|
});
|
||||||
openVegaWalletDialog();
|
openVegaWalletDialog();
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -1,8 +1,4 @@
|
|||||||
import {
|
import { VegaConnectDialog, VegaManageDialog } from '@vegaprotocol/wallet';
|
||||||
VegaConnectDialog,
|
|
||||||
VegaManageDialog,
|
|
||||||
ViewAsDialog,
|
|
||||||
} from '@vegaprotocol/wallet';
|
|
||||||
import {
|
import {
|
||||||
AppStateActionType,
|
AppStateActionType,
|
||||||
useAppState,
|
useAppState,
|
||||||
@@ -29,8 +25,6 @@ export const VegaWalletDialogs = () => {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<ViewAsDialog connector={Connectors.view} />
|
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -0,0 +1,17 @@
|
|||||||
|
import { Link } from '@vegaprotocol/ui-toolkit';
|
||||||
|
import { useTranslation } from 'react-i18next';
|
||||||
|
import { ExternalLinks } from '@vegaprotocol/environment';
|
||||||
|
|
||||||
|
export const DownloadWalletPrompt = () => {
|
||||||
|
const { t } = useTranslation();
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<h3 className="mt-4 mb-2">{t('getWallet')}</h3>
|
||||||
|
<p>
|
||||||
|
<Link className="text-neutral-500" href={ExternalLinks.VEGA_WALLET_URL}>
|
||||||
|
{t('getWalletLink')}
|
||||||
|
</Link>
|
||||||
|
</p>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
};
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
import { ButtonLink, Link } from '@vegaprotocol/ui-toolkit';
|
|
||||||
import { useTranslation } from 'react-i18next';
|
|
||||||
import { ExternalLinks } from '@vegaprotocol/environment';
|
|
||||||
import { useViewAsDialog } from '@vegaprotocol/wallet';
|
|
||||||
|
|
||||||
export const VegaWalletPrompt = () => {
|
|
||||||
const { t } = useTranslation();
|
|
||||||
const setViewAsDialog = useViewAsDialog((state) => state.setOpen);
|
|
||||||
return (
|
|
||||||
<>
|
|
||||||
<h3 className="mt-4 mb-2">{t('getWallet')}</h3>
|
|
||||||
<div className="flex flex-row gap-4">
|
|
||||||
<Link className="text-neutral-500" href={ExternalLinks.VEGA_WALLET_URL}>
|
|
||||||
{t('getWalletLink')}
|
|
||||||
</Link>
|
|
||||||
<ButtonLink
|
|
||||||
className="text-neutral-500"
|
|
||||||
data-testid="view-as-user"
|
|
||||||
onClick={() => setViewAsDialog(true)}
|
|
||||||
>
|
|
||||||
{t('viewAsParty')}
|
|
||||||
</ButtonLink>
|
|
||||||
</div>
|
|
||||||
</>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
@@ -20,7 +20,7 @@ import {
|
|||||||
WalletCardHeader,
|
WalletCardHeader,
|
||||||
WalletCardRow,
|
WalletCardRow,
|
||||||
} from '../wallet-card';
|
} from '../wallet-card';
|
||||||
import { VegaWalletPrompt } from './vega-wallet-prompt';
|
import { DownloadWalletPrompt } from './download-wallet-prompt';
|
||||||
import { usePollForDelegations } from './hooks';
|
import { usePollForDelegations } from './hooks';
|
||||||
import { useVegaWallet, useVegaWalletDialogStore } from '@vegaprotocol/wallet';
|
import { useVegaWallet, useVegaWalletDialogStore } from '@vegaprotocol/wallet';
|
||||||
import { Button, ButtonLink } from '@vegaprotocol/ui-toolkit';
|
import { Button, ButtonLink } from '@vegaprotocol/ui-toolkit';
|
||||||
@@ -71,6 +71,7 @@ export const VegaWallet = () => {
|
|||||||
|
|
||||||
const VegaWalletNotConnected = () => {
|
const VegaWalletNotConnected = () => {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
|
const { appDispatch } = useAppState();
|
||||||
const { openVegaWalletDialog } = useVegaWalletDialogStore((store) => ({
|
const { openVegaWalletDialog } = useVegaWalletDialogStore((store) => ({
|
||||||
openVegaWalletDialog: store.openVegaWalletDialog,
|
openVegaWalletDialog: store.openVegaWalletDialog,
|
||||||
}));
|
}));
|
||||||
@@ -78,6 +79,10 @@ const VegaWalletNotConnected = () => {
|
|||||||
<>
|
<>
|
||||||
<Button
|
<Button
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
|
appDispatch({
|
||||||
|
type: AppStateActionType.SET_VEGA_WALLET_OVERLAY,
|
||||||
|
isOpen: true,
|
||||||
|
});
|
||||||
openVegaWalletDialog();
|
openVegaWalletDialog();
|
||||||
}}
|
}}
|
||||||
fill={true}
|
fill={true}
|
||||||
@@ -85,7 +90,7 @@ const VegaWalletNotConnected = () => {
|
|||||||
>
|
>
|
||||||
{t('connectVegaWalletToUseAssociated')}
|
{t('connectVegaWalletToUseAssociated')}
|
||||||
</Button>
|
</Button>
|
||||||
<VegaWalletPrompt />
|
<DownloadWalletPrompt />
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -25,10 +25,6 @@ export const ContractAddresses: {
|
|||||||
claimAddress: customClaimAddress ?? '0x0',
|
claimAddress: customClaimAddress ?? '0x0',
|
||||||
lockedAddress: customLockedAddress ?? '0x0',
|
lockedAddress: customLockedAddress ?? '0x0',
|
||||||
},
|
},
|
||||||
MAINNET_MIRROR: {
|
|
||||||
claimAddress: '0x8Cef746ab7C83B61F6461cC92882bD61AB65a994', // TODO not deployed to this env, but random address so app doesn't error
|
|
||||||
lockedAddress: '0x0', // TODO not deployed to this env
|
|
||||||
},
|
|
||||||
DEVNET: {
|
DEVNET: {
|
||||||
claimAddress: '0x8Cef746ab7C83B61F6461cC92882bD61AB65a994', // TODO not deployed to this env, but random address so app doesn't error
|
claimAddress: '0x8Cef746ab7C83B61F6461cC92882bD61AB65a994', // TODO not deployed to this env, but random address so app doesn't error
|
||||||
lockedAddress: '0x0', // TODO not deployed to this env
|
lockedAddress: '0x0', // TODO not deployed to this env
|
||||||
@@ -67,6 +63,12 @@ export const ENV = {
|
|||||||
localProviderUrl: windowOrDefault('NX_LOCAL_PROVIDER_URL'),
|
localProviderUrl: windowOrDefault('NX_LOCAL_PROVIDER_URL'),
|
||||||
delegationsPagination: windowOrDefault('NX_DELEGATIONS_PAGINATION'),
|
delegationsPagination: windowOrDefault('NX_DELEGATIONS_PAGINATION'),
|
||||||
rest: windowOrDefault('NX_VEGA_REST_URL'),
|
rest: windowOrDefault('NX_VEGA_REST_URL'),
|
||||||
|
flags: {
|
||||||
|
NETWORK_DOWN: TRUTHY.includes(windowOrDefault('NX_NETWORK_DOWN')),
|
||||||
|
MOCK: TRUTHY.includes(windowOrDefault('NX_MOCKED')),
|
||||||
|
FAIRGROUND: TRUTHY.includes(windowOrDefault('NX_FAIRGROUND')),
|
||||||
|
NETWORK_LIMITS: TRUTHY.includes(windowOrDefault('NX_NETWORK_LIMITS')),
|
||||||
|
},
|
||||||
addresses:
|
addresses:
|
||||||
ContractAddresses[(envName === 'local' ? 'CUSTOM' : envName) as Networks],
|
ContractAddresses[(envName === 'local' ? 'CUSTOM' : envName) as Networks],
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -0,0 +1,5 @@
|
|||||||
|
import { ENV } from './env';
|
||||||
|
|
||||||
|
export const Flags = {
|
||||||
|
...ENV.flags,
|
||||||
|
};
|
||||||
@@ -1 +1,2 @@
|
|||||||
|
export * from './flags';
|
||||||
export * from './env';
|
export * from './env';
|
||||||
|
|||||||
@@ -28,6 +28,9 @@ export interface AppState {
|
|||||||
/** Total number of VEGA Tokens, both vesting and unlocked, associated for staking */
|
/** Total number of VEGA Tokens, both vesting and unlocked, associated for staking */
|
||||||
totalAssociated: BigNumber;
|
totalAssociated: BigNumber;
|
||||||
|
|
||||||
|
/** Whether or not the connect to VEGA wallet overlay is open */
|
||||||
|
vegaWalletOverlay: boolean;
|
||||||
|
|
||||||
/** Whether or not the manage VEGA wallet overlay is open */
|
/** Whether or not the manage VEGA wallet overlay is open */
|
||||||
vegaWalletManageOverlay: boolean;
|
vegaWalletManageOverlay: boolean;
|
||||||
|
|
||||||
@@ -49,7 +52,9 @@ export enum AppStateActionType {
|
|||||||
SET_TOKEN,
|
SET_TOKEN,
|
||||||
SET_ALLOWANCE,
|
SET_ALLOWANCE,
|
||||||
REFRESH_BALANCES,
|
REFRESH_BALANCES,
|
||||||
|
SET_VEGA_WALLET_OVERLAY,
|
||||||
SET_VEGA_WALLET_MANAGE_OVERLAY,
|
SET_VEGA_WALLET_MANAGE_OVERLAY,
|
||||||
|
SET_DRAWER,
|
||||||
REFRESH_ASSOCIATED_BALANCES,
|
REFRESH_ASSOCIATED_BALANCES,
|
||||||
SET_ASSOCIATION_BREAKDOWN,
|
SET_ASSOCIATION_BREAKDOWN,
|
||||||
SET_TRANSACTION_OVERLAY,
|
SET_TRANSACTION_OVERLAY,
|
||||||
@@ -64,10 +69,18 @@ export type AppStateAction =
|
|||||||
totalSupply: BigNumber;
|
totalSupply: BigNumber;
|
||||||
totalAssociated: BigNumber;
|
totalAssociated: BigNumber;
|
||||||
}
|
}
|
||||||
|
| {
|
||||||
|
type: AppStateActionType.SET_VEGA_WALLET_OVERLAY;
|
||||||
|
isOpen: boolean;
|
||||||
|
}
|
||||||
| {
|
| {
|
||||||
type: AppStateActionType.SET_VEGA_WALLET_MANAGE_OVERLAY;
|
type: AppStateActionType.SET_VEGA_WALLET_MANAGE_OVERLAY;
|
||||||
isOpen: boolean;
|
isOpen: boolean;
|
||||||
}
|
}
|
||||||
|
| {
|
||||||
|
type: AppStateActionType.SET_DRAWER;
|
||||||
|
isOpen: boolean;
|
||||||
|
}
|
||||||
| {
|
| {
|
||||||
type: AppStateActionType.SET_TRANSACTION_OVERLAY;
|
type: AppStateActionType.SET_TRANSACTION_OVERLAY;
|
||||||
isOpen: boolean;
|
isOpen: boolean;
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ const initialAppState: AppState = {
|
|||||||
totalAssociated: new BigNumber(0),
|
totalAssociated: new BigNumber(0),
|
||||||
decimals: 0,
|
decimals: 0,
|
||||||
totalSupply: new BigNumber(0),
|
totalSupply: new BigNumber(0),
|
||||||
|
vegaWalletOverlay: false,
|
||||||
vegaWalletManageOverlay: false,
|
vegaWalletManageOverlay: false,
|
||||||
transactionOverlay: false,
|
transactionOverlay: false,
|
||||||
bannerMessage: '',
|
bannerMessage: '',
|
||||||
@@ -30,10 +31,23 @@ function appStateReducer(state: AppState, action: AppStateAction): AppState {
|
|||||||
totalAssociated: action.totalAssociated,
|
totalAssociated: action.totalAssociated,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
case AppStateActionType.SET_VEGA_WALLET_OVERLAY: {
|
||||||
|
return {
|
||||||
|
...state,
|
||||||
|
vegaWalletOverlay: action.isOpen,
|
||||||
|
};
|
||||||
|
}
|
||||||
case AppStateActionType.SET_VEGA_WALLET_MANAGE_OVERLAY: {
|
case AppStateActionType.SET_VEGA_WALLET_MANAGE_OVERLAY: {
|
||||||
return {
|
return {
|
||||||
...state,
|
...state,
|
||||||
vegaWalletManageOverlay: action.isOpen,
|
vegaWalletManageOverlay: action.isOpen,
|
||||||
|
vegaWalletOverlay: action.isOpen ? false : state.vegaWalletOverlay,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
case AppStateActionType.SET_DRAWER: {
|
||||||
|
return {
|
||||||
|
...state,
|
||||||
|
vegaWalletOverlay: false,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
case AppStateActionType.SET_TRANSACTION_OVERLAY: {
|
case AppStateActionType.SET_TRANSACTION_OVERLAY: {
|
||||||
|
|||||||
@@ -166,7 +166,6 @@
|
|||||||
"proposedEnactment": "Proposed enactment",
|
"proposedEnactment": "Proposed enactment",
|
||||||
"Enacted": "Enacted",
|
"Enacted": "Enacted",
|
||||||
"enactedOn": "Enacted on",
|
"enactedOn": "Enacted on",
|
||||||
"enactedOn{{date}}": "Enacted on {{enactmentDate}}",
|
|
||||||
"status": "Status",
|
"status": "Status",
|
||||||
"state": "State",
|
"state": "State",
|
||||||
"shouldPass": "Should pass",
|
"shouldPass": "Should pass",
|
||||||
@@ -186,7 +185,6 @@
|
|||||||
"proposedOn": "Proposed on",
|
"proposedOn": "Proposed on",
|
||||||
"proposedBy": "Proposed by",
|
"proposedBy": "Proposed by",
|
||||||
"toEnactOn": "Enacts on",
|
"toEnactOn": "Enacts on",
|
||||||
"enactsOn{{date}}": "Enacts on {{enactmentDate}}",
|
|
||||||
"closesOn": "Closes on",
|
"closesOn": "Closes on",
|
||||||
"closedOn": "Closed on",
|
"closedOn": "Closed on",
|
||||||
"errorDetails": "Error details",
|
"errorDetails": "Error details",
|
||||||
@@ -219,7 +217,6 @@
|
|||||||
"votingThresholdInfo": "If the token vote passes the participation threshold it will be the deciding vote. If not, the outcome will be determined by liquidity providers on this market.",
|
"votingThresholdInfo": "If the token vote passes the participation threshold it will be the deciding vote. If not, the outcome will be determined by liquidity providers on this market.",
|
||||||
"noGovernanceTokens": "You need some VEGA tokens to participate in governance",
|
"noGovernanceTokens": "You need some VEGA tokens to participate in governance",
|
||||||
"youVoted": "You voted",
|
"youVoted": "You voted",
|
||||||
"voted": "Voted",
|
|
||||||
"changeVote": "Change vote",
|
"changeVote": "Change vote",
|
||||||
"txRequested": "Confirm transaction in wallet",
|
"txRequested": "Confirm transaction in wallet",
|
||||||
"votePending": "Casting vote",
|
"votePending": "Casting vote",
|
||||||
@@ -631,6 +628,7 @@
|
|||||||
"pendingDescriptionLinkText": "set up and run a node on Vega",
|
"pendingDescriptionLinkText": "set up and run a node on Vega",
|
||||||
"pendingDescription2": ". A node can move from being a candidate into standby based on how much nomination it attracts, assuming it has proven reliability by sending heartbeats to the network.",
|
"pendingDescription2": ". A node can move from being a candidate into standby based on how much nomination it attracts, assuming it has proven reliability by sending heartbeats to the network.",
|
||||||
"n/a": "N/A",
|
"n/a": "N/A",
|
||||||
|
"Set to": "Set to",
|
||||||
"pass": "pass",
|
"pass": "pass",
|
||||||
"fail": "fail",
|
"fail": "fail",
|
||||||
"New asset": "New asset",
|
"New asset": "New asset",
|
||||||
@@ -790,7 +788,7 @@
|
|||||||
"overstakedPenalty": "Overstaked penalty",
|
"overstakedPenalty": "Overstaked penalty",
|
||||||
"multisigPenalty": "Multisig penalty",
|
"multisigPenalty": "Multisig penalty",
|
||||||
"homeProposalsIntro": "Decisions on the Vega network are on-chain, with tokenholders creating proposals that other tokenholders vote to approve or reject. Network upgrades are proposed and approved by validators.",
|
"homeProposalsIntro": "Decisions on the Vega network are on-chain, with tokenholders creating proposals that other tokenholders vote to approve or reject. Network upgrades are proposed and approved by validators.",
|
||||||
"homeProposalsButtonText": "See all proposals",
|
"homeProposalsButtonText": "Browse, vote, and propose",
|
||||||
"homeValidatorsIntro": "Vega runs on a delegated proof of stake blockchain, where validators earn fees for validating block transactions. Tokenholders can nominate validators by staking tokens to them.",
|
"homeValidatorsIntro": "Vega runs on a delegated proof of stake blockchain, where validators earn fees for validating block transactions. Tokenholders can nominate validators by staking tokens to them.",
|
||||||
"homeValidatorsButtonText": "Browse, and stake",
|
"homeValidatorsButtonText": "Browse, and stake",
|
||||||
"homeRewardsIntro": "Track rewards you've earned for trading, liquidity provision, market creation, and staking.",
|
"homeRewardsIntro": "Track rewards you've earned for trading, liquidity provision, market creation, and staking.",
|
||||||
@@ -839,22 +837,5 @@
|
|||||||
"RejectedProposals": "Rejected proposals",
|
"RejectedProposals": "Rejected proposals",
|
||||||
"networkGovernance": "Network governance",
|
"networkGovernance": "Network governance",
|
||||||
"networkUpgrades": "Network upgrades",
|
"networkUpgrades": "Network upgrades",
|
||||||
"assetSpecification": "Asset specification",
|
"assetSpecification": "Asset specification"
|
||||||
"viewDetails": "View details",
|
|
||||||
"vegaGovernance": "Vega Governance",
|
|
||||||
"latestProposals": "Latest proposals",
|
|
||||||
"vegaToken": "VEGA Token",
|
|
||||||
"majorityVotedForProposal": "majority voted for this proposal",
|
|
||||||
"majorityNotVotedForProposal": "majority not voted for this proposal",
|
|
||||||
"requiredMajorityVotedForProposal": "Required majority voted for this proposal",
|
|
||||||
"requiredMajorityNotVotedForProposal": "Required majority not voted for this proposal",
|
|
||||||
"minParticipationReached": "Min. participation reached",
|
|
||||||
"minParticipationNotReached": "Min. participation not reached",
|
|
||||||
"consensusNodes": "consensus nodes",
|
|
||||||
"activeNodes": "active nodes",
|
|
||||||
"Estimated time to upgrade": "Estimated time to upgrade",
|
|
||||||
"Upgraded at": "Upgraded at",
|
|
||||||
"dataIsIdentical": "Data is identical",
|
|
||||||
"updatesToMarket": "Updates to market",
|
|
||||||
"viewAsParty": "View as party"
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html lang="en" class="dark bg-black w-full h-full">
|
<html lang="en" class="dark bg-black w-full h-full">
|
||||||
<head>
|
<head>
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
||||||
<meta charset="utf-8" />
|
<meta charset="utf-8" />
|
||||||
|
<link rel="stylesheet" href="//static.vega.xyz/fonts.css" />
|
||||||
<link
|
<link
|
||||||
rel="icon"
|
rel="icon"
|
||||||
type="image/x-icon"
|
type="image/x-icon"
|
||||||
@@ -10,42 +10,35 @@
|
|||||||
/>
|
/>
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||||
<meta name="theme-color" content="#000000" />
|
<meta name="theme-color" content="#000000" />
|
||||||
<meta name="description" content="Vega Protocol - VEGA Governance" />
|
<meta name="description" content="Vega Protocol - VEGA Token Vesting" />
|
||||||
<meta name="og:type" content="website" />
|
|
||||||
<meta name="og:url" content="https://governance.vega.xyz/" />
|
|
||||||
<meta name="og:title" content="Vega Protocol - Governance" />
|
|
||||||
<meta name="og:site_name" content="Vega Protocol - Governance" />
|
|
||||||
<meta name="og:image" content="https://static.vega.xyz/favicon.ico" />
|
|
||||||
|
|
||||||
<meta name="twitter:card" content="https://static.vega.xyz/favicon.ico" />
|
|
||||||
<meta name="twitter:title" content="Vega Protocol - Governance" />
|
|
||||||
<meta name="twitter:description" content="Vega Protocol - Governance" />
|
|
||||||
<meta name="twitter:image" content="https://static.vega.xyz/favicon.ico" />
|
|
||||||
<meta name="twitter:image:alt" content="VEGA logo" />
|
|
||||||
<meta name="twitter:site" content="@vegaprotocol" />
|
|
||||||
|
|
||||||
<meta name="description" content="Vega Protocol - Governance" />
|
|
||||||
<link rel="apple-touch-icon" href="assets/apple-touch-icon.png" />
|
<link rel="apple-touch-icon" href="assets/apple-touch-icon.png" />
|
||||||
|
<!--
|
||||||
|
manifest.json provides metadata used when your web app is installed on a
|
||||||
|
user's mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/
|
||||||
|
-->
|
||||||
<link rel="manifest" href="assets/manifest.json" />
|
<link rel="manifest" href="assets/manifest.json" />
|
||||||
<link
|
<link
|
||||||
rel="preload"
|
rel="preload"
|
||||||
href="https://static.vega.xyz/AlphaLyrae-Medium.woff2"
|
href="https://static.vega.xyz/AlphaLyrae-Medium.woff2"
|
||||||
as="font"
|
as="font"
|
||||||
type="font/woff2"
|
type="font/woff2"
|
||||||
|
crossorigin="anonymous"
|
||||||
/>
|
/>
|
||||||
<title>VEGA Governance</title>
|
<title>Vega Governance dApp</title>
|
||||||
<script src="./assets/env-config.js"></script>
|
<script src="./assets/env-config.js"></script>
|
||||||
</head>
|
</head>
|
||||||
<body class="h-full">
|
<body class="h-full">
|
||||||
<noscript> You need to enable JavaScript to run this app. </noscript>
|
<noscript>You need to enable JavaScript to run this app.</noscript>
|
||||||
<div id="root" class="h-full"></div>
|
<div id="root" class="h-full"></div>
|
||||||
<!-- This HTML file is a template.
|
<!--
|
||||||
|
This HTML file is a template.
|
||||||
If you open it directly in the browser, you will see an empty page.
|
If you open it directly in the browser, you will see an empty page.
|
||||||
|
|
||||||
You can add webfonts, meta tags, or analytics to this file.
|
You can add webfonts, meta tags, or analytics to this file.
|
||||||
The build step will place the bundled scripts into the <body> tag.
|
The build step will place the bundled scripts into the <body> tag.
|
||||||
|
|
||||||
To begin the development, run `npm start` or `yarn start`.
|
To begin the development, run `npm start` or `yarn start`.
|
||||||
To create a production bundle, use `npm run build` or `yarn build`. -->
|
To create a production bundle, use `npm run build` or `yarn build`.
|
||||||
|
-->
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -20,6 +20,6 @@ export const downloadJson = (jsonString: string, proposalTitle: string) => {
|
|||||||
window.URL.revokeObjectURL(url);
|
window.URL.revokeObjectURL(url);
|
||||||
document.body.removeChild(a);
|
document.body.removeChild(a);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error(error);
|
console.log(error);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import {
|
import {
|
||||||
|
RestConnector,
|
||||||
JsonRpcConnector,
|
JsonRpcConnector,
|
||||||
ViewConnector,
|
ViewConnector,
|
||||||
InjectedConnector,
|
InjectedConnector,
|
||||||
@@ -6,12 +7,14 @@ import {
|
|||||||
|
|
||||||
const urlParams = new URLSearchParams(window.location.search);
|
const urlParams = new URLSearchParams(window.location.search);
|
||||||
|
|
||||||
export const injected = new InjectedConnector();
|
export const rest = new RestConnector();
|
||||||
export const jsonRpc = new JsonRpcConnector();
|
export const jsonRpc = new JsonRpcConnector();
|
||||||
|
export const injected = new InjectedConnector();
|
||||||
export const view = new ViewConnector(urlParams.get('address'));
|
export const view = new ViewConnector(urlParams.get('address'));
|
||||||
|
|
||||||
export const Connectors = {
|
export const Connectors = {
|
||||||
injected,
|
injected,
|
||||||
|
rest,
|
||||||
jsonRpc,
|
jsonRpc,
|
||||||
view,
|
view,
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ import {
|
|||||||
getNotRejectedProposals,
|
getNotRejectedProposals,
|
||||||
getNotRejectedProtocolUpgradeProposals,
|
getNotRejectedProtocolUpgradeProposals,
|
||||||
} from '../proposals/proposals/proposals-container';
|
} from '../proposals/proposals/proposals-container';
|
||||||
import { Heading, SubHeading } from '../../components/heading';
|
import { Heading } from '../../components/heading';
|
||||||
import * as Schema from '@vegaprotocol/types';
|
import * as Schema from '@vegaprotocol/types';
|
||||||
import type { RouteChildProps } from '..';
|
import type { RouteChildProps } from '..';
|
||||||
import type { ProposalFieldsFragment } from '../proposals/proposals/__generated__/Proposals';
|
import type { ProposalFieldsFragment } from '../proposals/proposals/__generated__/Proposals';
|
||||||
@@ -31,11 +31,6 @@ import {
|
|||||||
orderByDate,
|
orderByDate,
|
||||||
orderByUpgradeBlockHeight,
|
orderByUpgradeBlockHeight,
|
||||||
} from '../proposals/components/proposals-list/proposals-list';
|
} from '../proposals/components/proposals-list/proposals-list';
|
||||||
import {
|
|
||||||
NetworkParams,
|
|
||||||
useNetworkParams,
|
|
||||||
} from '@vegaprotocol/network-parameters';
|
|
||||||
import { BigNumber } from '../../lib/bignumber';
|
|
||||||
|
|
||||||
const nodesToShow = 6;
|
const nodesToShow = 6;
|
||||||
|
|
||||||
@@ -47,57 +42,33 @@ const HomeProposals = ({
|
|||||||
protocolUpgradeProposals: ProtocolUpgradeProposalFieldsFragment[];
|
protocolUpgradeProposals: ProtocolUpgradeProposalFieldsFragment[];
|
||||||
}) => {
|
}) => {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
const {
|
|
||||||
params: networkParams,
|
|
||||||
loading: networkParamsLoading,
|
|
||||||
error: networkParamsError,
|
|
||||||
} = useNetworkParams([
|
|
||||||
NetworkParams.governance_proposal_market_requiredMajority,
|
|
||||||
NetworkParams.governance_proposal_updateMarket_requiredMajority,
|
|
||||||
NetworkParams.governance_proposal_updateMarket_requiredMajorityLP,
|
|
||||||
NetworkParams.governance_proposal_asset_requiredMajority,
|
|
||||||
NetworkParams.governance_proposal_updateAsset_requiredMajority,
|
|
||||||
NetworkParams.governance_proposal_updateNetParam_requiredMajority,
|
|
||||||
NetworkParams.governance_proposal_freeform_requiredMajority,
|
|
||||||
]);
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<AsyncRenderer
|
<section className="mb-16" data-testid="home-proposals">
|
||||||
loading={networkParamsLoading}
|
<Heading title={t('Proposals')} />
|
||||||
error={networkParamsError}
|
<h3 className="mb-6">{t('homeProposalsIntro')}</h3>
|
||||||
data={networkParams}
|
<div className="flex items-center mb-8 gap-8">
|
||||||
>
|
<Link to={`${Routes.PROPOSALS}`}>
|
||||||
<section className="mb-16" data-testid="home-proposals">
|
<Button size="md">{t('homeProposalsButtonText')}</Button>
|
||||||
<Heading title={t('vegaGovernance')} />
|
</Link>
|
||||||
<h3 className="mb-6">{t('homeProposalsIntro')}</h3>
|
|
||||||
<div className="mb-8">
|
|
||||||
<ExternalLink href={ExternalLinks.GOVERNANCE_PAGE}>
|
|
||||||
{t(`readMoreGovernance`)}
|
|
||||||
</ExternalLink>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<SubHeading title={t('latestProposals')} />
|
<ExternalLink href={ExternalLinks.GOVERNANCE_PAGE}>
|
||||||
<ul data-testid="home-proposal-list" className="grid gap-6">
|
{t(`readMoreGovernance`)}
|
||||||
{protocolUpgradeProposals.map((proposal, index) => (
|
</ExternalLink>
|
||||||
<ProtocolUpgradeProposalsListItem key={index} proposal={proposal} />
|
</div>
|
||||||
))}
|
<ul
|
||||||
|
data-testid="home-proposal-list"
|
||||||
|
className="grid md:grid-cols-2 lg:grid-cols-1 xl:grid-cols-2 gap-6"
|
||||||
|
>
|
||||||
|
{protocolUpgradeProposals.map((proposal, index) => (
|
||||||
|
<ProtocolUpgradeProposalsListItem key={index} proposal={proposal} />
|
||||||
|
))}
|
||||||
|
|
||||||
{proposals.map((proposal) => (
|
{proposals.map((proposal) => (
|
||||||
<ProposalsListItem
|
<ProposalsListItem key={proposal.id} proposal={proposal} />
|
||||||
key={proposal.id}
|
))}
|
||||||
proposal={proposal}
|
</ul>
|
||||||
networkParams={networkParams}
|
</section>
|
||||||
/>
|
|
||||||
))}
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<div className="mt-6">
|
|
||||||
<Link to={`${Routes.PROPOSALS}`}>
|
|
||||||
<Button size="md">{t('homeProposalsButtonText')}</Button>
|
|
||||||
</Link>
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
</AsyncRenderer>
|
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -115,8 +86,8 @@ const HomeNodes = ({
|
|||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
|
|
||||||
const highlightedNodeData = [
|
const highlightedNodeData = [
|
||||||
{ title: t('activeNodes'), length: activeNodes.length },
|
{ title: t('active nodes'), length: activeNodes.length },
|
||||||
{ title: t('consensusNodes'), length: consensusNodes.length },
|
{ title: t('consensus nodes'), length: consensusNodes.length },
|
||||||
];
|
];
|
||||||
|
|
||||||
return (
|
return (
|
||||||
@@ -262,7 +233,7 @@ const GovernanceHome = ({ name }: RouteChildProps) => {
|
|||||||
[protocolUpgradeProposals]
|
[protocolUpgradeProposals]
|
||||||
);
|
);
|
||||||
|
|
||||||
const totalProposalsDesired = 3;
|
const totalProposalsDesired = 4;
|
||||||
const protocolUpgradeProposalsToShow = sortedProtocolUpgradeProposals.slice(
|
const protocolUpgradeProposalsToShow = sortedProtocolUpgradeProposals.slice(
|
||||||
0,
|
0,
|
||||||
totalProposalsDesired
|
totalProposalsDesired
|
||||||
@@ -277,8 +248,6 @@ const GovernanceHome = ({ name }: RouteChildProps) => {
|
|||||||
|
|
||||||
const activeNodes = removePaginationWrapper(
|
const activeNodes = removePaginationWrapper(
|
||||||
validatorsData?.nodesConnection.edges
|
validatorsData?.nodesConnection.edges
|
||||||
).filter((node) =>
|
|
||||||
new BigNumber(node.rankingScore.performanceScore).isGreaterThan(0)
|
|
||||||
);
|
);
|
||||||
|
|
||||||
const trimmedActiveNodes = activeNodes?.slice(0, nodesToShow);
|
const trimmedActiveNodes = activeNodes?.slice(0, nodesToShow);
|
||||||
@@ -318,7 +287,7 @@ const GovernanceHome = ({ name }: RouteChildProps) => {
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div data-testid="home-vega-token">
|
<div data-testid="home-vega-token">
|
||||||
<Heading title={t('vegaToken')} marginTop={false} />
|
<Heading title={t('VEGA Token')} marginTop={false} />
|
||||||
<h3 className="mb-6">{t('homeVegaTokenIntro')}</h3>
|
<h3 className="mb-6">{t('homeVegaTokenIntro')}</h3>
|
||||||
<div className="flex items-center mb-8 gap-4">
|
<div className="flex items-center mb-8 gap-4">
|
||||||
<Link to={Routes.WITHDRAWALS}>
|
<Link to={Routes.WITHDRAWALS}>
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user