Compare commits
6
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ba0af64bef | ||
|
|
be4fb779ef | ||
|
|
f2eedc434d | ||
|
|
4eacbbba1c | ||
|
|
e9188344cf | ||
|
|
16c18b972d |
@@ -1,7 +1,8 @@
|
|||||||
---
|
---
|
||||||
name: Feature Epic
|
name: Feature Epic
|
||||||
about: A template to capture and scope user requirements, high level process, and basic mockups for an upcoming feature as part of the initial core spec review process.
|
about:
|
||||||
title: 'FEATURE EPIC: '
|
A template to capture and scope user requirements, high level process, and basic mockups for an upcoming feature as part of the initial core spec review process.
|
||||||
|
title: 'Epic: '
|
||||||
labels: feature-epic
|
labels: feature-epic
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# Related issues 🔗
|
# Related issues 🔗
|
||||||
|
|
||||||
Issue: #[Issue number here]
|
Closes #[Issue number here]
|
||||||
|
|
||||||
# Description ℹ️
|
# Description ℹ️
|
||||||
|
|
||||||
|
|||||||
@@ -137,7 +137,7 @@ jobs:
|
|||||||
secrets: inherit
|
secrets: inherit
|
||||||
with:
|
with:
|
||||||
projects: ${{ needs.lint-test-build.outputs.projects-e2e }}
|
projects: ${{ needs.lint-test-build.outputs.projects-e2e }}
|
||||||
tags: '@smoke'
|
tags: '@smoke @regression'
|
||||||
|
|
||||||
publish-dist:
|
publish-dist:
|
||||||
needs: lint-test-build
|
needs: lint-test-build
|
||||||
|
|||||||
@@ -10,8 +10,8 @@ on:
|
|||||||
jobs:
|
jobs:
|
||||||
run-tests:
|
run-tests:
|
||||||
name: run-tests
|
name: run-tests
|
||||||
runs-on: 8-cores
|
runs-on: ubuntu-22.04
|
||||||
timeout-minutes: 20
|
timeout-minutes: 25
|
||||||
steps:
|
steps:
|
||||||
#----------------------------------------------
|
#----------------------------------------------
|
||||||
# check-out frontend-monorepo
|
# check-out frontend-monorepo
|
||||||
@@ -125,7 +125,7 @@ jobs:
|
|||||||
#----------------------------------------------
|
#----------------------------------------------
|
||||||
- name: Run tests
|
- name: Run tests
|
||||||
working-directory: ./console-test
|
working-directory: ./console-test
|
||||||
run: poetry run pytest -v -s --numprocesses auto --dist loadfile --durations=20
|
run: poetry run pytest --numprocesses auto
|
||||||
- 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: 120
|
timeout-minutes: 100
|
||||||
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,7 +15,6 @@ on:
|
|||||||
- types
|
- types
|
||||||
- utils
|
- utils
|
||||||
- i18n
|
- i18n
|
||||||
- wallet
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
publish:
|
publish:
|
||||||
|
|||||||
@@ -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,26 +0,0 @@
|
|||||||
{
|
|
||||||
"proposalSubmission": {
|
|
||||||
"rationale": {
|
|
||||||
"title": "Test new asset proposal",
|
|
||||||
"description": "E2E test for proposals"
|
|
||||||
},
|
|
||||||
"terms": {
|
|
||||||
"newAsset": {
|
|
||||||
"changes": {
|
|
||||||
"name": "USDT Coin",
|
|
||||||
"symbol": "USDT",
|
|
||||||
"decimals": "18",
|
|
||||||
"quantum": "1",
|
|
||||||
"erc20": {
|
|
||||||
"contractAddress": "0xb404c51bbc10dcbe948077f18a4b8e553d160084",
|
|
||||||
"withdrawThreshold": "10",
|
|
||||||
"lifetimeLimit": "10"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"closingTimestamp": 1724339572,
|
|
||||||
"enactmentTimestamp": 1724339572,
|
|
||||||
"validationTimestamp": 1692799617
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
import { createSuccessorMarketProposal } from '../support/governance.functions';
|
|
||||||
|
|
||||||
context('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 = 'markets-heading';
|
||||||
|
const createdMarketId =
|
||||||
|
'2eab0e66545a789047561bc5a2e5cbc3b19eb708da41104e3cac2474ee36c4d4';
|
||||||
|
|
||||||
before('Create market', function () {
|
before('Create market', function () {
|
||||||
cy.visit('/');
|
cy.visit('/');
|
||||||
@@ -11,7 +11,7 @@ context('Market page', { tags: '@regression' }, function () {
|
|||||||
|
|
||||||
beforeEach('Get market id', function () {
|
beforeEach('Get market id', function () {
|
||||||
cy.navigate_to('markets');
|
cy.navigate_to('markets');
|
||||||
cy.get('[col-id="id"]').last().invoke('text').as('createdMarketId');
|
cy.get('[col-id="id"]').eq(1).invoke('text').as('createdMarketId');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('Market displayed on market page', function () {
|
it('Market displayed on market page', function () {
|
||||||
@@ -106,7 +106,6 @@ context('Market page', { tags: '@regression' }, function () {
|
|||||||
// Able to view Json
|
// Able to view Json
|
||||||
cy.contains('View JSON').click();
|
cy.contains('View JSON').click();
|
||||||
cy.get('.language-json').should('exist');
|
cy.get('.language-json').should('exist');
|
||||||
cy.getByTestId('icon-cross').click();
|
|
||||||
});
|
});
|
||||||
|
|
||||||
// Skipping due to resize observer loop limit error
|
// Skipping due to resize observer loop limit error
|
||||||
@@ -114,60 +113,17 @@ context('Market page', { tags: '@regression' }, function () {
|
|||||||
cy.common_switch_to_mobile_and_click_toggle();
|
cy.common_switch_to_mobile_and_click_toggle();
|
||||||
cy.navigate_to('markets', true);
|
cy.navigate_to('markets', true);
|
||||||
cy.getByTestId(marketHeaders).should('be.visible');
|
cy.getByTestId(marketHeaders).should('be.visible');
|
||||||
cy.get(`[row-id="${this.createdMarketId}"]`)
|
cy.get(`[row-id="${createdMarketId}"]`)
|
||||||
.should('be.visible')
|
.should('be.visible')
|
||||||
.within(() => {
|
.within(() => {
|
||||||
cy.get_element_by_col_id('code').should('have.text', 'TEST.24h');
|
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('name').should('have.text', 'Test market 1');
|
||||||
cy.get_element_by_col_id('state').should('have.text', 'Pending');
|
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('asset').should('have.text', 'fUSDC');
|
||||||
cy.get_element_by_col_id('id').should(
|
cy.get_element_by_col_id('id').should('have.text', createdMarketId);
|
||||||
'have.text',
|
|
||||||
this.createdMarketId
|
|
||||||
);
|
|
||||||
cy.get_element_by_col_id('actions')
|
cy.get_element_by_col_id('actions')
|
||||||
.find('a')
|
.find('a')
|
||||||
.should('have.attr', 'href', `/markets/${this.createdMarketId}`);
|
.should('have.attr', 'href', `/markets/${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,93 +0,0 @@
|
|||||||
import { getNewAssetTxBody } from '../support/governance.functions';
|
|
||||||
|
|
||||||
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;
|
|
||||||
|
|
||||||
before('Create market proposal', function () {
|
|
||||||
cy.visit('/');
|
|
||||||
cy.createMarket();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('Able to view proposal', function () {
|
|
||||||
const proposalTitle = 'Add Lorem Ipsum market';
|
|
||||||
|
|
||||||
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.getByTestId('vote-progress-bar-for')
|
|
||||||
.invoke('attr', 'style')
|
|
||||||
.should('eq', 'width: 100%;');
|
|
||||||
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');
|
|
||||||
cy.getByTestId('icon-cross').click();
|
|
||||||
});
|
|
||||||
|
|
||||||
it.skip('Proposal page displayed on mobile', function () {
|
|
||||||
const proposalTitle = 'Add Lorem Ipsum market';
|
|
||||||
|
|
||||||
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);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
it('Able to view new asset proposal', function () {
|
|
||||||
const proposalTitle = 'Test new asset proposal';
|
|
||||||
const newAssetProposalBody = getNewAssetTxBody();
|
|
||||||
cy.VegaWalletSubmitProposal(newAssetProposalBody);
|
|
||||||
|
|
||||||
cy.visit('/');
|
|
||||||
cy.navigate_to('governanceProposals');
|
|
||||||
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', 'NewAsset');
|
|
||||||
cy.get_element_by_col_id('state').should(
|
|
||||||
'have.text',
|
|
||||||
'Waiting for Node Vote'
|
|
||||||
);
|
|
||||||
cy.getByTestId('vote-progress').should('be.visible');
|
|
||||||
cy.getByTestId('vote-progress-bar-against')
|
|
||||||
.invoke('attr', 'style')
|
|
||||||
.should('eq', 'width: 100%;');
|
|
||||||
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();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
@@ -127,10 +127,3 @@ Cypress.Commands.add(
|
|||||||
.should('have.text', tableRowValue);
|
.should('have.text', tableRowValue);
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
Cypress.Commands.add(
|
|
||||||
'validate_proposal_change_type',
|
|
||||||
(tableRowName, changeType) => {
|
|
||||||
cy.contains(tableRowName).siblings().should('have.text', changeType);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|||||||
@@ -1,181 +0,0 @@
|
|||||||
import { addSeconds, millisecondsToSeconds } from 'date-fns';
|
|
||||||
|
|
||||||
export function createSuccessorMarketProposal(parentMarketId) {
|
|
||||||
cy.VegaWalletSubmitProposal(getSuccessorTxBody(parentMarketId));
|
|
||||||
}
|
|
||||||
|
|
||||||
function getSuccessorTxBody(parentMarketId) {
|
|
||||||
const MIN_CLOSE_SEC = 500;
|
|
||||||
const MIN_ENACT_SEC = 700;
|
|
||||||
|
|
||||||
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',
|
|
||||||
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,
|
|
||||||
enactmentTimestamp,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
export function getNewAssetTxBody() {
|
|
||||||
const MIN_CLOSE_SEC = 500;
|
|
||||||
const MIN_ENACT_SEC = 700;
|
|
||||||
const MIN_VALID_SEC = 60;
|
|
||||||
|
|
||||||
const closingDate = addSeconds(new Date(), MIN_CLOSE_SEC);
|
|
||||||
const enactmentDate = addSeconds(closingDate, MIN_ENACT_SEC);
|
|
||||||
const validationDate = addSeconds(new Date(), MIN_VALID_SEC);
|
|
||||||
|
|
||||||
const closingTimestamp = millisecondsToSeconds(closingDate.getTime());
|
|
||||||
const enactmentTimestamp = millisecondsToSeconds(enactmentDate.getTime());
|
|
||||||
const validationTimestamp = millisecondsToSeconds(validationDate.getTime());
|
|
||||||
|
|
||||||
return {
|
|
||||||
proposalSubmission: {
|
|
||||||
rationale: {
|
|
||||||
title: 'Test new asset proposal',
|
|
||||||
description: 'E2E test for proposals',
|
|
||||||
},
|
|
||||||
terms: {
|
|
||||||
newAsset: {
|
|
||||||
changes: {
|
|
||||||
name: 'USDT Coin',
|
|
||||||
symbol: 'USDT',
|
|
||||||
decimals: '18',
|
|
||||||
quantum: '1',
|
|
||||||
erc20: {
|
|
||||||
contractAddress: '0xb404c51bbc10dcbe948077f18a4b8e553d160084',
|
|
||||||
withdrawThreshold: '10',
|
|
||||||
lifetimeLimit: '10',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
closingTimestamp,
|
|
||||||
enactmentTimestamp,
|
|
||||||
validationTimestamp,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
};
|
|
||||||
}
|
|
||||||
@@ -1,4 +1,6 @@
|
|||||||
# App configuration variables
|
# App configuration variables
|
||||||
|
NX_TENDERMINT_URL=http://localhost:26617
|
||||||
|
NX_TENDERMINT_WEBSOCKET_URL=wss://localhost:26617/websocket
|
||||||
NX_VEGA_ENV=CUSTOM
|
NX_VEGA_ENV=CUSTOM
|
||||||
NX_ETHERSCAN_URL=https://sepolia.etherscan.io
|
NX_ETHERSCAN_URL=https://sepolia.etherscan.io
|
||||||
NX_ANNOUNCEMENTS_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/announcements/test/announcements.json
|
NX_ANNOUNCEMENTS_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/announcements/test/announcements.json
|
||||||
@@ -6,6 +8,3 @@ NX_VEGA_EXPLORER_URL=/
|
|||||||
|
|
||||||
# App flags
|
# App flags
|
||||||
NX_EXPLORER_TXS_LIST=0
|
NX_EXPLORER_TXS_LIST=0
|
||||||
|
|
||||||
NX_TENDERMINT_URL=http://localhost:26617
|
|
||||||
NX_TENDERMINT_WEBSOCKET_URL=wss://localhost:26617/websocket
|
|
||||||
|
|||||||
@@ -1,4 +1,6 @@
|
|||||||
# App configuration variables
|
# App configuration variables
|
||||||
|
NX_TENDERMINT_URL=https://tm.be.devnet1.vega.xyz/
|
||||||
|
NX_TENDERMINT_WEBSOCKET_URL=wss://be.devnet1.vega.xyz/websocket
|
||||||
NX_VEGA_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/networks-internal/main/devnet1/vegawallet-devnet1.toml
|
NX_VEGA_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/networks-internal/main/devnet1/vegawallet-devnet1.toml
|
||||||
NX_VEGA_ENV=DEVNET
|
NX_VEGA_ENV=DEVNET
|
||||||
NX_BLOCK_EXPLORER=https://be.devnet1.vega.xyz/rest
|
NX_BLOCK_EXPLORER=https://be.devnet1.vega.xyz/rest
|
||||||
@@ -8,6 +10,3 @@ NX_VEGA_URL=https://api.devnet1.vega.xyz/graphql
|
|||||||
NX_VEGA_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/networks-internal/main/devnet1/vegawallet-devnet1.toml
|
NX_VEGA_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/networks-internal/main/devnet1/vegawallet-devnet1.toml
|
||||||
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_EXPLORER_URL=/
|
NX_VEGA_EXPLORER_URL=/
|
||||||
|
|
||||||
NX_TENDERMINT_URL=https://tm.be.devnet1.vega.xyz/
|
|
||||||
NX_TENDERMINT_WEBSOCKET_URL=wss://be.devnet1.vega.xyz/websocket
|
|
||||||
|
|||||||
@@ -1,4 +1,6 @@
|
|||||||
# App configuration variables
|
# App configuration variables
|
||||||
|
NX_TENDERMINT_URL=https://be.vega.community
|
||||||
|
NX_TENDERMINT_WEBSOCKET_URL=wss://be.vega.community/websocket
|
||||||
NX_SENTRY_DSN=https://b3a56b03eda842faad731f3ea9dfd1bc@o286262.ingest.sentry.io/6242427
|
NX_SENTRY_DSN=https://b3a56b03eda842faad731f3ea9dfd1bc@o286262.ingest.sentry.io/6242427
|
||||||
NX_VEGA_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/networks/master/mainnet1/mainnet1.toml
|
NX_VEGA_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/networks/master/mainnet1/mainnet1.toml
|
||||||
NX_VEGA_URL=https://api.vega.community/graphql
|
NX_VEGA_URL=https://api.vega.community/graphql
|
||||||
@@ -9,6 +11,3 @@ NX_VEGA_GOVERNANCE_URL=https://governance.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_EXPLORER_URL=https://explorer.vega.xyz/
|
NX_VEGA_EXPLORER_URL=https://explorer.vega.xyz/
|
||||||
NX_VEGA_CONSOLE_URL=https://console.vega.xyz
|
NX_VEGA_CONSOLE_URL=https://console.vega.xyz
|
||||||
|
|
||||||
NX_TENDERMINT_URL=https://be.vega.community
|
|
||||||
NX_TENDERMINT_WEBSOCKET_URL=wss://be.vega.community/websocket
|
|
||||||
|
|||||||
@@ -1,4 +1,6 @@
|
|||||||
# App configuration variables
|
# App configuration variables
|
||||||
|
NX_TENDERMINT_URL=https://be.mainnet-mirror.vega.rocks
|
||||||
|
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
|
||||||
@@ -8,7 +10,4 @@ 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
|
||||||
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_EXPLORER_URL=https://explorer.mainnet-mirror.vega.rocks/
|
NX_VEGA_EXPLORER_URL=https://explorer.mainnet-mirror.vega.rocks/
|
||||||
NX_VEGA_CONSOLE_URL=https://console.mainnet-mirror.vega.rocks
|
NX_VEGA_CONSOLE_URL=https://console.mainnet-mirror.vega.rocks
|
||||||
|
|
||||||
NX_TENDERMINT_URL=https://be.mainnet-mirror.vega.rocks
|
|
||||||
NX_TENDERMINT_WEBSOCKET_URL=wss://be.mainnet-mirror.vega.rocks/websocket
|
|
||||||
@@ -1,5 +1,7 @@
|
|||||||
# App configuration variables
|
# App configuration variables
|
||||||
|
NX_TENDERMINT_URL=https://tm.be.testnet.vega.xyz
|
||||||
NX_BLOCK_EXPLORER=https://be.testnet.vega.xyz/rest
|
NX_BLOCK_EXPLORER=https://be.testnet.vega.xyz/rest
|
||||||
|
NX_TENDERMINT_WEBSOCKET_URL=wss://be.testnet.vega.xyz/websocket
|
||||||
NX_VEGA_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/networks-internal/main/fairground/vegawallet-fairground.toml
|
NX_VEGA_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/networks-internal/main/fairground/vegawallet-fairground.toml
|
||||||
NX_VEGA_ENV=TESTNET
|
NX_VEGA_ENV=TESTNET
|
||||||
NX_VEGA_URL=https://api.n07.testnet.vega.xyz/graphql
|
NX_VEGA_URL=https://api.n07.testnet.vega.xyz/graphql
|
||||||
@@ -9,6 +11,3 @@ NX_VEGA_GOVERNANCE_URL=https://governance.fairground.wtf
|
|||||||
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_EXPLORER_URL=https://explorer.fairground.wtf
|
NX_VEGA_EXPLORER_URL=https://explorer.fairground.wtf
|
||||||
NX_VEGA_CONSOLE_URL=https://console.fairground.wtf
|
NX_VEGA_CONSOLE_URL=https://console.fairground.wtf
|
||||||
|
|
||||||
NX_TENDERMINT_URL=https://tm.be.testnet.vega.xyz
|
|
||||||
NX_TENDERMINT_WEBSOCKET_URL=wss://be.testnet.vega.xyz/websocket
|
|
||||||
|
|||||||
@@ -7,10 +7,9 @@ NX_ETHEREUM_PROVIDER_URL=https://sepolia.infura.io/v3/4f846e79e13f44d1b51bbd7ed9
|
|||||||
NX_ETHERSCAN_URL=https://sepolia.etherscan.io
|
NX_ETHERSCAN_URL=https://sepolia.etherscan.io
|
||||||
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_TENDERMINT_URL=https://tm.be.validators-testnet.vega.rocks
|
||||||
NX_BLOCK_EXPLORER=https://be.validators-testnet.vega.rocks/rest
|
NX_BLOCK_EXPLORER=https://be.validators-testnet.vega.rocks/rest
|
||||||
|
NX_TENDERMINT_WEBSOCKET_URL=wss://be.validators-testnet.vega.xyz/websocket
|
||||||
NX_VEGA_GOVERNANCE_URL=https://governance.validators-testnet.vega.rocks
|
NX_VEGA_GOVERNANCE_URL=https://governance.validators-testnet.vega.rocks
|
||||||
NX_VEGA_EXPLORER_URL=https://explorer.validators-testnet.vega.rocks/
|
NX_VEGA_EXPLORER_URL=https://explorer.validators-testnet.vega.rocks/
|
||||||
NX_VEGA_CONSOLE_URL=https://trading.validators-testnet.vega.rocks/
|
NX_VEGA_CONSOLE_URL=https://trading.validators-testnet.vega.rocks/
|
||||||
|
|
||||||
NX_TENDERMINT_URL=https://tm.be.validators-testnet.vega.rocks
|
|
||||||
NX_TENDERMINT_WEBSOCKET_URL=wss://be.validators-testnet.vega.xyz/websocket
|
|
||||||
|
|||||||
@@ -77,7 +77,7 @@
|
|||||||
"executor": "nx:run-commands",
|
"executor": "nx:run-commands",
|
||||||
"options": {
|
"options": {
|
||||||
"commands": [
|
"commands": [
|
||||||
"npx openapi-typescript https://raw.githubusercontent.com/vegaprotocol/documentation/main/specs/v0.72.3/blockexplorer.openapi.json --output apps/explorer/src/types/explorer.d.ts --immutable-types"
|
"npx openapi-typescript https://raw.githubusercontent.com/vegaprotocol/documentation/spec-update-v0.72.0-preview.2/specs/v0.72.0-preview.2/blockexplorer.openapi.json --output apps/explorer/src/types/explorer.d.ts --immutable-types"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,25 +0,0 @@
|
|||||||
fragment ExplorerStopOrderFields on StopOrder {
|
|
||||||
id
|
|
||||||
status
|
|
||||||
createdAt
|
|
||||||
trigger {
|
|
||||||
... on StopOrderPrice {
|
|
||||||
price
|
|
||||||
}
|
|
||||||
... on StopOrderTrailingPercentOffset {
|
|
||||||
trailingPercentOffset
|
|
||||||
}
|
|
||||||
}
|
|
||||||
createdAt
|
|
||||||
ocoLinkId
|
|
||||||
triggerDirection
|
|
||||||
order {
|
|
||||||
id
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
query ExplorerStopOrder($stopOrderId: ID!) {
|
|
||||||
stopOrder(id: $stopOrderId) {
|
|
||||||
...ExplorerStopOrderFields
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,70 +0,0 @@
|
|||||||
import * as Types from '@vegaprotocol/types';
|
|
||||||
|
|
||||||
import { gql } from '@apollo/client';
|
|
||||||
import * as Apollo from '@apollo/client';
|
|
||||||
const defaultOptions = {} as const;
|
|
||||||
export type ExplorerStopOrderFieldsFragment = { __typename?: 'StopOrder', id: string, status: Types.StopOrderStatus, createdAt: any, ocoLinkId?: string | null, triggerDirection: Types.StopOrderTriggerDirection, trigger: { __typename?: 'StopOrderPrice', price: string } | { __typename?: 'StopOrderTrailingPercentOffset', trailingPercentOffset: string }, order?: { __typename?: 'Order', id: string } | null };
|
|
||||||
|
|
||||||
export type ExplorerStopOrderQueryVariables = Types.Exact<{
|
|
||||||
stopOrderId: Types.Scalars['ID'];
|
|
||||||
}>;
|
|
||||||
|
|
||||||
|
|
||||||
export type ExplorerStopOrderQuery = { __typename?: 'Query', stopOrder?: { __typename?: 'StopOrder', id: string, status: Types.StopOrderStatus, createdAt: any, ocoLinkId?: string | null, triggerDirection: Types.StopOrderTriggerDirection, trigger: { __typename?: 'StopOrderPrice', price: string } | { __typename?: 'StopOrderTrailingPercentOffset', trailingPercentOffset: string }, order?: { __typename?: 'Order', id: string } | null } | null };
|
|
||||||
|
|
||||||
export const ExplorerStopOrderFieldsFragmentDoc = gql`
|
|
||||||
fragment ExplorerStopOrderFields on StopOrder {
|
|
||||||
id
|
|
||||||
status
|
|
||||||
createdAt
|
|
||||||
trigger {
|
|
||||||
... on StopOrderPrice {
|
|
||||||
price
|
|
||||||
}
|
|
||||||
... on StopOrderTrailingPercentOffset {
|
|
||||||
trailingPercentOffset
|
|
||||||
}
|
|
||||||
}
|
|
||||||
createdAt
|
|
||||||
ocoLinkId
|
|
||||||
triggerDirection
|
|
||||||
order {
|
|
||||||
id
|
|
||||||
}
|
|
||||||
}
|
|
||||||
`;
|
|
||||||
export const ExplorerStopOrderDocument = gql`
|
|
||||||
query ExplorerStopOrder($stopOrderId: ID!) {
|
|
||||||
stopOrder(id: $stopOrderId) {
|
|
||||||
...ExplorerStopOrderFields
|
|
||||||
}
|
|
||||||
}
|
|
||||||
${ExplorerStopOrderFieldsFragmentDoc}`;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* __useExplorerStopOrderQuery__
|
|
||||||
*
|
|
||||||
* To run a query within a React component, call `useExplorerStopOrderQuery` and pass it any options that fit your needs.
|
|
||||||
* When your component renders, `useExplorerStopOrderQuery` returns an object from Apollo Client that contains loading, error, and data properties
|
|
||||||
* you can use to render your UI.
|
|
||||||
*
|
|
||||||
* @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options;
|
|
||||||
*
|
|
||||||
* @example
|
|
||||||
* const { data, loading, error } = useExplorerStopOrderQuery({
|
|
||||||
* variables: {
|
|
||||||
* stopOrderId: // value for 'stopOrderId'
|
|
||||||
* },
|
|
||||||
* });
|
|
||||||
*/
|
|
||||||
export function useExplorerStopOrderQuery(baseOptions: Apollo.QueryHookOptions<ExplorerStopOrderQuery, ExplorerStopOrderQueryVariables>) {
|
|
||||||
const options = {...defaultOptions, ...baseOptions}
|
|
||||||
return Apollo.useQuery<ExplorerStopOrderQuery, ExplorerStopOrderQueryVariables>(ExplorerStopOrderDocument, options);
|
|
||||||
}
|
|
||||||
export function useExplorerStopOrderLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions<ExplorerStopOrderQuery, ExplorerStopOrderQueryVariables>) {
|
|
||||||
const options = {...defaultOptions, ...baseOptions}
|
|
||||||
return Apollo.useLazyQuery<ExplorerStopOrderQuery, ExplorerStopOrderQueryVariables>(ExplorerStopOrderDocument, options);
|
|
||||||
}
|
|
||||||
export type ExplorerStopOrderQueryHookResult = ReturnType<typeof useExplorerStopOrderQuery>;
|
|
||||||
export type ExplorerStopOrderLazyQueryHookResult = ReturnType<typeof useExplorerStopOrderLazyQuery>;
|
|
||||||
export type ExplorerStopOrderQueryResult = Apollo.QueryResult<ExplorerStopOrderQuery, ExplorerStopOrderQueryVariables>;
|
|
||||||
@@ -33,7 +33,7 @@ describe('Order TX Summary component', () => {
|
|||||||
expect(res.queryByTestId('order-summary')).not.toBeInTheDocument();
|
expect(res.queryByTestId('order-summary')).not.toBeInTheDocument();
|
||||||
});
|
});
|
||||||
|
|
||||||
it('Renders "Market Price" if the order passed lacks a price', () => {
|
it('Renders nothing if the order passed lacks a price', () => {
|
||||||
const o: Order = {
|
const o: Order = {
|
||||||
marketId: '123',
|
marketId: '123',
|
||||||
side: 'SIDE_BUY',
|
side: 'SIDE_BUY',
|
||||||
@@ -41,7 +41,7 @@ describe('Order TX Summary component', () => {
|
|||||||
size: '10',
|
size: '10',
|
||||||
};
|
};
|
||||||
const res = renderComponent(o);
|
const res = renderComponent(o);
|
||||||
expect(res.queryByText('Market Price')).toBeInTheDocument();
|
expect(res.queryByTestId('order-summary')).not.toBeInTheDocument();
|
||||||
});
|
});
|
||||||
|
|
||||||
it('Renders nothing if the order has an unspecified side', () => {
|
it('Renders nothing if the order has an unspecified side', () => {
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ import type { components } from '../../../types/explorer';
|
|||||||
import PriceInMarket from '../price-in-market/price-in-market';
|
import PriceInMarket from '../price-in-market/price-in-market';
|
||||||
import { sideText } from '../order-details/lib/order-labels';
|
import { sideText } from '../order-details/lib/order-labels';
|
||||||
import SizeInMarket from '../size-in-market/size-in-market';
|
import SizeInMarket from '../size-in-market/size-in-market';
|
||||||
import { t } from '@vegaprotocol/i18n';
|
|
||||||
|
|
||||||
export type OrderSummaryProps = {
|
export type OrderSummaryProps = {
|
||||||
order: components['schemas']['v1OrderSubmission'];
|
order: components['schemas']['v1OrderSubmission'];
|
||||||
@@ -21,6 +20,7 @@ const OrderTxSummary = ({ order }: OrderSummaryProps) => {
|
|||||||
if (
|
if (
|
||||||
!order ||
|
!order ||
|
||||||
!order.marketId ||
|
!order.marketId ||
|
||||||
|
!order.price ||
|
||||||
!order.side ||
|
!order.side ||
|
||||||
order.side === 'SIDE_UNSPECIFIED'
|
order.side === 'SIDE_UNSPECIFIED'
|
||||||
) {
|
) {
|
||||||
@@ -36,14 +36,10 @@ const OrderTxSummary = ({ order }: OrderSummaryProps) => {
|
|||||||
'-'
|
'-'
|
||||||
)}
|
)}
|
||||||
<i className="text-xs">@</i>
|
<i className="text-xs">@</i>
|
||||||
{order.price ? (
|
<PriceInMarket
|
||||||
<PriceInMarket
|
marketId={order.marketId}
|
||||||
marketId={order.marketId}
|
price={order.price}
|
||||||
price={order.price}
|
></PriceInMarket>
|
||||||
></PriceInMarket>
|
|
||||||
) : (
|
|
||||||
t('Market Price')
|
|
||||||
)}
|
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,139 +0,0 @@
|
|||||||
import { t } from '@vegaprotocol/i18n';
|
|
||||||
import type { components } from '../../../../../types/explorer';
|
|
||||||
import { formatNumberPercentage } from '@vegaprotocol/utils';
|
|
||||||
import BigNumber from 'bignumber.js';
|
|
||||||
import PriceInMarket from '../../../price-in-market/price-in-market';
|
|
||||||
import StopOrderTriggerSummary from './stop-order-trigger';
|
|
||||||
import { Tooltip } from '@vegaprotocol/ui-toolkit';
|
|
||||||
import fromUnixTime from 'date-fns/fromUnixTime';
|
|
||||||
|
|
||||||
const wrapperClasses =
|
|
||||||
'flex-1 max-w-xs items-center border border-vega-light-200 dark:border-vega-dark-150 rounded-md pv-2 ph-5 mb-5';
|
|
||||||
|
|
||||||
export type StopOrderType = 'RisesAbove' | 'FallsBelow' | 'OCO';
|
|
||||||
type V1OrderSetup = components['schemas']['v1StopOrderSetup'];
|
|
||||||
|
|
||||||
interface StopOrderSetupProps extends V1OrderSetup {
|
|
||||||
type: StopOrderType;
|
|
||||||
deterministicId: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export function getExpiryTypeLabel(
|
|
||||||
expiryStrategy: V1OrderSetup['expiryStrategy']
|
|
||||||
): string {
|
|
||||||
switch (expiryStrategy) {
|
|
||||||
case 'EXPIRY_STRATEGY_CANCELS':
|
|
||||||
return t('Cancels');
|
|
||||||
case 'EXPIRY_STRATEGY_SUBMIT':
|
|
||||||
return t('Submit');
|
|
||||||
}
|
|
||||||
|
|
||||||
return expiryStrategy || t('Unknown');
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ExpiryTriggerProps {
|
|
||||||
trailingPercentOffset?: string;
|
|
||||||
price?: string;
|
|
||||||
marketId?: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export function ExpiryTrigger({
|
|
||||||
trailingPercentOffset,
|
|
||||||
price,
|
|
||||||
marketId,
|
|
||||||
}: ExpiryTriggerProps) {
|
|
||||||
if (price && marketId) {
|
|
||||||
return <PriceInMarket price={price} marketId={marketId} />;
|
|
||||||
}
|
|
||||||
if (trailingPercentOffset) {
|
|
||||||
return (
|
|
||||||
<span>
|
|
||||||
{formatNumberPercentage(new BigNumber(trailingPercentOffset))}{' '}
|
|
||||||
(trailing)
|
|
||||||
</span>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
export function getMovePrefix(
|
|
||||||
type: StopOrderType,
|
|
||||||
trailingPercentOffset?: string
|
|
||||||
): string {
|
|
||||||
if (type === 'RisesAbove') {
|
|
||||||
if (trailingPercentOffset) {
|
|
||||||
return '+';
|
|
||||||
} else {
|
|
||||||
return '>';
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (trailingPercentOffset) {
|
|
||||||
return '-';
|
|
||||||
} else {
|
|
||||||
return '<';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export const TypeLabel = {
|
|
||||||
RisesAbove: t('Rises above ↗'),
|
|
||||||
FallsBelow: t('Falls below ↘'),
|
|
||||||
OCO: '',
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
*/
|
|
||||||
export const StopOrderSetup = ({
|
|
||||||
type,
|
|
||||||
price,
|
|
||||||
orderSubmission,
|
|
||||||
expiresAt,
|
|
||||||
expiryStrategy,
|
|
||||||
trailingPercentOffset,
|
|
||||||
deterministicId,
|
|
||||||
}: StopOrderSetupProps) => {
|
|
||||||
let d = 'Unknown';
|
|
||||||
try {
|
|
||||||
d = expiresAt
|
|
||||||
? fromUnixTime(parseInt(expiresAt) / 1000000000).toLocaleString()
|
|
||||||
: t('Unknown');
|
|
||||||
} catch (e) {
|
|
||||||
d = t('Unknown');
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
|
||||||
<div className={wrapperClasses}>
|
|
||||||
<div className="mb-12 lg:mb-0">
|
|
||||||
<div className="bg-slate-100 text-slate-900 px-6 py-2 md:px-6 flex">
|
|
||||||
<div className="flex-1">
|
|
||||||
<strong className="font-bold mb-1">{TypeLabel[type]} </strong>
|
|
||||||
<p className=" font-xs mb-0">
|
|
||||||
{getMovePrefix(type, trailingPercentOffset)}
|
|
||||||
<ExpiryTrigger
|
|
||||||
trailingPercentOffset={trailingPercentOffset}
|
|
||||||
price={price}
|
|
||||||
marketId={orderSubmission?.marketId}
|
|
||||||
/>
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{expiresAt && expiryStrategy ? (
|
|
||||||
<div className="flex-1">
|
|
||||||
<strong className="font-bold mb-1">{t('Expiry Type')}</strong>
|
|
||||||
<p className=" font-xs mb-0">
|
|
||||||
<Tooltip description={<span>{d}</span>}>
|
|
||||||
<span>{getExpiryTypeLabel(expiryStrategy)}</span>
|
|
||||||
</Tooltip>
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
) : null}
|
|
||||||
</div>
|
|
||||||
<StopOrderTriggerSummary
|
|
||||||
id={deterministicId}
|
|
||||||
orderSubmission={orderSubmission}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
@@ -1,108 +0,0 @@
|
|||||||
import { StopOrderStatus } from '@vegaprotocol/types';
|
|
||||||
import { useExplorerStopOrderQuery } from '../../../order-details/__generated__/StopOrder';
|
|
||||||
import type { ExplorerStopOrderQuery } from '../../../order-details/__generated__/StopOrder';
|
|
||||||
import { t } from '@vegaprotocol/i18n';
|
|
||||||
import { Icon } from '@vegaprotocol/ui-toolkit';
|
|
||||||
import type { IconName } from '@vegaprotocol/ui-toolkit';
|
|
||||||
import OrderTxSummary from '../../../order-summary/order-tx-summary';
|
|
||||||
import type { components } from '../../../../../types/explorer';
|
|
||||||
import type { ApolloError } from '@apollo/client';
|
|
||||||
|
|
||||||
export const StatusLabel: Record<StopOrderStatus, string> = {
|
|
||||||
[StopOrderStatus.STATUS_CANCELLED]: t('Cancelled'),
|
|
||||||
[StopOrderStatus.STATUS_EXPIRED]: t('Expired'),
|
|
||||||
[StopOrderStatus.STATUS_PENDING]: t('Pending'),
|
|
||||||
[StopOrderStatus.STATUS_REJECTED]: t('Rejected'),
|
|
||||||
[StopOrderStatus.STATUS_STOPPED]: t('Stopped'),
|
|
||||||
[StopOrderStatus.STATUS_TRIGGERED]: t('Triggered'),
|
|
||||||
[StopOrderStatus.STATUS_UNSPECIFIED]: t('Status unknown'),
|
|
||||||
};
|
|
||||||
|
|
||||||
export const StatusIcon: Record<StopOrderStatus, IconName> = {
|
|
||||||
[StopOrderStatus.STATUS_CANCELLED]: 'disable',
|
|
||||||
[StopOrderStatus.STATUS_EXPIRED]: 'outdated',
|
|
||||||
[StopOrderStatus.STATUS_PENDING]: 'circle',
|
|
||||||
[StopOrderStatus.STATUS_REJECTED]: 'cross',
|
|
||||||
[StopOrderStatus.STATUS_STOPPED]: 'stop',
|
|
||||||
[StopOrderStatus.STATUS_TRIGGERED]: 'tick',
|
|
||||||
[StopOrderStatus.STATUS_UNSPECIFIED]: 'help',
|
|
||||||
};
|
|
||||||
|
|
||||||
export const StatusMidColor: Record<StopOrderStatus, string> = {
|
|
||||||
[StopOrderStatus.STATUS_CANCELLED]: 'bg-red-100 text-red-900',
|
|
||||||
[StopOrderStatus.STATUS_EXPIRED]: 'bg-red-100 text-red-900',
|
|
||||||
[StopOrderStatus.STATUS_PENDING]: 'bg-yellow-100 text-yellow-900',
|
|
||||||
[StopOrderStatus.STATUS_REJECTED]: 'bg-red-100 text-red-900',
|
|
||||||
[StopOrderStatus.STATUS_STOPPED]: 'bg-red-100 text-red-900',
|
|
||||||
[StopOrderStatus.STATUS_TRIGGERED]: 'bg-green-100 text-green-900',
|
|
||||||
[StopOrderStatus.STATUS_UNSPECIFIED]: 'bg-yellow-100 text-yellow-900',
|
|
||||||
};
|
|
||||||
|
|
||||||
export const StatusBottomColor: Record<StopOrderStatus, string> = {
|
|
||||||
[StopOrderStatus.STATUS_CANCELLED]: 'bg-red-50 text-red-900 line-through',
|
|
||||||
[StopOrderStatus.STATUS_EXPIRED]: 'bg-red-50 text-red-900 line-through',
|
|
||||||
[StopOrderStatus.STATUS_PENDING]: 'bg-yellow-50 text-yellow-900',
|
|
||||||
[StopOrderStatus.STATUS_REJECTED]: 'bg-red-50 text-red-900 line-through',
|
|
||||||
[StopOrderStatus.STATUS_STOPPED]: 'bg-red-50 text-red-900 line-through',
|
|
||||||
[StopOrderStatus.STATUS_TRIGGERED]: 'bg-green-50 text-green-900',
|
|
||||||
[StopOrderStatus.STATUS_UNSPECIFIED]:
|
|
||||||
'bg-yellow-50 text-yellow-900 line-through',
|
|
||||||
};
|
|
||||||
|
|
||||||
export function getStopOrderTriggerStatus(
|
|
||||||
data?: ExplorerStopOrderQuery,
|
|
||||||
error?: ApolloError
|
|
||||||
) {
|
|
||||||
if (data && data.stopOrder) {
|
|
||||||
return data.stopOrder.status;
|
|
||||||
}
|
|
||||||
|
|
||||||
return StopOrderStatus.STATUS_UNSPECIFIED;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface StopOrderTriggerSummaryProps {
|
|
||||||
id: string;
|
|
||||||
orderSubmission?: components['schemas']['v1OrderSubmission'];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*/
|
|
||||||
const StopOrderTriggerSummary = ({
|
|
||||||
id,
|
|
||||||
orderSubmission,
|
|
||||||
}: StopOrderTriggerSummaryProps) => {
|
|
||||||
const { data, error } = useExplorerStopOrderQuery({
|
|
||||||
variables: { stopOrderId: id },
|
|
||||||
});
|
|
||||||
|
|
||||||
const status = getStopOrderTriggerStatus(data, error);
|
|
||||||
|
|
||||||
return (
|
|
||||||
<>
|
|
||||||
<div
|
|
||||||
className={`${StatusMidColor[status]} px-3 py-2 md:px-6 flex space-x-4`}
|
|
||||||
>
|
|
||||||
<p className="m-0 p-0 align-top">
|
|
||||||
<Icon
|
|
||||||
size={6}
|
|
||||||
name={StatusIcon[status]}
|
|
||||||
className="inline-block mr-2"
|
|
||||||
/>
|
|
||||||
<span className="align-top">{StatusLabel[status]}</span>
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div
|
|
||||||
className={`${StatusBottomColor[status]} px-3 py-2 md:px-6 flex space-x-4`}
|
|
||||||
>
|
|
||||||
{orderSubmission && (
|
|
||||||
<p className="text-vega-grey-400 strike">
|
|
||||||
<OrderTxSummary order={orderSubmission} />
|
|
||||||
</p>
|
|
||||||
)}
|
|
||||||
</div>
|
|
||||||
</>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
export default StopOrderTriggerSummary;
|
|
||||||
@@ -1,12 +1,10 @@
|
|||||||
import { t } from '@vegaprotocol/i18n';
|
import { t } from '@vegaprotocol/i18n';
|
||||||
import type { components } from '../../../../../types/explorer';
|
import type { components } from '../../../../../types/explorer';
|
||||||
import { Tooltip } from '@vegaprotocol/ui-toolkit';
|
import { Tooltip } from '@vegaprotocol/ui-toolkit';
|
||||||
import SizeInMarket from '../../../size-in-market/size-in-market';
|
|
||||||
|
|
||||||
export interface TxDetailsOrderIcebergDetailsProps {
|
export interface TxDetailsOrderIcebergDetailsProps {
|
||||||
iceberg: components['schemas']['v1IcebergOpts'];
|
iceberg: components['schemas']['v1IcebergOpts'];
|
||||||
size: components['schemas']['v1OrderSubmission']['size'];
|
size: components['schemas']['v1OrderSubmission']['size'];
|
||||||
marketId?: string;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -30,7 +28,6 @@ export interface TxDetailsOrderIcebergDetailsProps {
|
|||||||
export const TxOrderIcebergDetails = ({
|
export const TxOrderIcebergDetails = ({
|
||||||
iceberg,
|
iceberg,
|
||||||
size,
|
size,
|
||||||
marketId,
|
|
||||||
}: TxDetailsOrderIcebergDetailsProps) => {
|
}: TxDetailsOrderIcebergDetailsProps) => {
|
||||||
return (
|
return (
|
||||||
<div
|
<div
|
||||||
@@ -39,28 +36,15 @@ export const TxOrderIcebergDetails = ({
|
|||||||
>
|
>
|
||||||
<Tooltip description={t('Iceberg: Minimum visible size')}>
|
<Tooltip description={t('Iceberg: Minimum visible size')}>
|
||||||
<span className="align-bottom text-vega-orange-650">
|
<span className="align-bottom text-vega-orange-650">
|
||||||
{marketId ? (
|
{iceberg.minimumVisibleSize || '-'}
|
||||||
<SizeInMarket
|
|
||||||
size={iceberg.minimumVisibleSize}
|
|
||||||
marketId={marketId}
|
|
||||||
/>
|
|
||||||
) : (
|
|
||||||
iceberg.minimumVisibleSize
|
|
||||||
)}
|
|
||||||
</span>
|
</span>
|
||||||
</Tooltip>
|
</Tooltip>
|
||||||
<Tooltip description={t('Iceberg: Total size')}>
|
<Tooltip description={t('Iceberg: Total size')}>
|
||||||
<span className="text-sm text-vega-blue-600 mx-3">
|
<span className="text-sm text-vega-blue-600 mx-3">{size}</span>
|
||||||
{marketId ? <SizeInMarket size={size} marketId={marketId} /> : size}
|
|
||||||
</span>
|
|
||||||
</Tooltip>
|
</Tooltip>
|
||||||
<Tooltip description={t('Iceberg: Visible peak')}>
|
<Tooltip description={t('Iceberg: Visible peak')}>
|
||||||
<span className="align-top text-vega-yellow-600">
|
<span className="align-top text-vega-yellow-600">
|
||||||
{marketId ? (
|
{iceberg.peakSize || '-'}
|
||||||
<SizeInMarket size={iceberg.peakSize} marketId={marketId} />
|
|
||||||
) : (
|
|
||||||
iceberg.peakSize
|
|
||||||
)}
|
|
||||||
</span>
|
</span>
|
||||||
</Tooltip>
|
</Tooltip>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -26,11 +26,6 @@ export const sharedHeaderProps = {
|
|||||||
className: 'align-top',
|
className: 'align-top',
|
||||||
};
|
};
|
||||||
|
|
||||||
const Labels: Record<BlockExplorerTransactionResult['type'], string> = {
|
|
||||||
'Stop Orders Submission': 'Stop Order',
|
|
||||||
'Stop Orders Cancellation': 'Cancel Stop Order',
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* These rows are shown for every transaction type, providing a consistent set of rows for the top
|
* These rows are shown for every transaction type, providing a consistent set of rows for the top
|
||||||
* of a transaction details row. The order is relatively arbitrary but felt right - it might need to
|
* of a transaction details row. The order is relatively arbitrary but felt right - it might need to
|
||||||
@@ -49,14 +44,12 @@ export const TxDetailsShared = ({
|
|||||||
const time: string = blockData?.result.block.header.time || '';
|
const time: string = blockData?.result.block.header.time || '';
|
||||||
const height: string = blockData?.result.block.header.height || txData.block;
|
const height: string = blockData?.result.block.header.height || txData.block;
|
||||||
|
|
||||||
const type = Labels[txData.type] || txData.type;
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
{hideTypeRow === false ? (
|
{hideTypeRow === false ? (
|
||||||
<TableRow modifier="bordered">
|
<TableRow modifier="bordered">
|
||||||
<TableCell {...sharedHeaderProps}>{t('Type')}</TableCell>
|
<TableCell {...sharedHeaderProps}>{t('Type')}</TableCell>
|
||||||
<TableCell>{type}</TableCell>
|
<TableCell>{txData.type}</TableCell>
|
||||||
</TableRow>
|
</TableRow>
|
||||||
) : null}
|
) : null}
|
||||||
<TableRow modifier="bordered">
|
<TableRow modifier="bordered">
|
||||||
|
|||||||
@@ -31,8 +31,6 @@ const AccountType: Record<AccountTypes, string> = {
|
|||||||
ACCOUNT_TYPE_REWARD_LP_RECEIVED_FEES: 'LP Received Fees',
|
ACCOUNT_TYPE_REWARD_LP_RECEIVED_FEES: 'LP Received Fees',
|
||||||
ACCOUNT_TYPE_REWARD_MARKET_PROPOSERS: 'Market Proposers',
|
ACCOUNT_TYPE_REWARD_MARKET_PROPOSERS: 'Market Proposers',
|
||||||
ACCOUNT_TYPE_HOLDING: 'Holding',
|
ACCOUNT_TYPE_HOLDING: 'Holding',
|
||||||
ACCOUNT_TYPE_LIQUIDITY_FEES_BONUS_DISTRIBUTION: 'Bonus Distribution',
|
|
||||||
ACCOUNT_TYPE_LP_LIQUIDITY_FEES: 'LP Liquidity Fees',
|
|
||||||
};
|
};
|
||||||
|
|
||||||
interface TransferParticipantsProps {
|
interface TransferParticipantsProps {
|
||||||
|
|||||||
@@ -11,7 +11,6 @@ import { TxDetailsBatch } from './tx-batch';
|
|||||||
import { TxDetailsChainEvent } from './tx-chain-event';
|
import { TxDetailsChainEvent } from './tx-chain-event';
|
||||||
import { TxDetailsNodeVote } from './tx-node-vote';
|
import { TxDetailsNodeVote } from './tx-node-vote';
|
||||||
import { TxDetailsOrderCancel } from './tx-order-cancel';
|
import { TxDetailsOrderCancel } from './tx-order-cancel';
|
||||||
import { TxDetailsStopOrderCancel } from './tx-stop-order-cancel';
|
|
||||||
import { TxDetailsOrderAmend } from './tx-order-amend';
|
import { TxDetailsOrderAmend } from './tx-order-amend';
|
||||||
import { TxDetailsWithdrawSubmission } from './tx-withdraw-submission';
|
import { TxDetailsWithdrawSubmission } from './tx-withdraw-submission';
|
||||||
import { TxDetailsDelegate } from './tx-delegation';
|
import { TxDetailsDelegate } from './tx-delegation';
|
||||||
@@ -27,7 +26,6 @@ import { TxDetailsNodeAnnounce } from './tx-node-announce';
|
|||||||
import { TxDetailsStateVariable } from './tx-state-variable-proposal';
|
import { TxDetailsStateVariable } from './tx-state-variable-proposal';
|
||||||
import { TxProposal } from './tx-proposal';
|
import { TxProposal } from './tx-proposal';
|
||||||
import { TxDetailsTransfer } from './tx-transfer';
|
import { TxDetailsTransfer } from './tx-transfer';
|
||||||
import { TxDetailsStopOrderSubmission } from './tx-stop-order-submission';
|
|
||||||
|
|
||||||
interface TxDetailsWrapperProps {
|
interface TxDetailsWrapperProps {
|
||||||
txData: BlockExplorerTransactionResult | undefined;
|
txData: BlockExplorerTransactionResult | undefined;
|
||||||
@@ -87,8 +85,6 @@ function getTransactionComponent(txData?: BlockExplorerTransactionResult) {
|
|||||||
return TxDetailsProtocolUpgrade;
|
return TxDetailsProtocolUpgrade;
|
||||||
case 'Cancel Order':
|
case 'Cancel Order':
|
||||||
return TxDetailsOrderCancel;
|
return TxDetailsOrderCancel;
|
||||||
case 'Stop Orders Cancellation':
|
|
||||||
return TxDetailsStopOrderCancel;
|
|
||||||
case 'Amend Order':
|
case 'Amend Order':
|
||||||
return TxDetailsOrderAmend;
|
return TxDetailsOrderAmend;
|
||||||
case 'Validator Heartbeat':
|
case 'Validator Heartbeat':
|
||||||
@@ -117,8 +113,6 @@ function getTransactionComponent(txData?: BlockExplorerTransactionResult) {
|
|||||||
return TxDetailsUndelegate;
|
return TxDetailsUndelegate;
|
||||||
case 'State Variable Proposal':
|
case 'State Variable Proposal':
|
||||||
return TxDetailsStateVariable;
|
return TxDetailsStateVariable;
|
||||||
case 'Stop Orders Submission':
|
|
||||||
return TxDetailsStopOrderSubmission;
|
|
||||||
case 'Transfer Funds':
|
case 'Transfer Funds':
|
||||||
return TxDetailsTransfer;
|
return TxDetailsTransfer;
|
||||||
default:
|
default:
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ export const TxDetailsIssueSignatures = ({
|
|||||||
return <>{t('Awaiting Block Explorer transaction details')}</>;
|
return <>{t('Awaiting Block Explorer transaction details')}</>;
|
||||||
}
|
}
|
||||||
|
|
||||||
const cmd: Command = txData.command.issueSignatures;
|
const cmd: Command = txData.command;
|
||||||
const k = cmd.kind ? kind[cmd.kind] : null;
|
const k = cmd.kind ? kind[cmd.kind] : null;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|||||||
@@ -81,11 +81,7 @@ export const TxDetailsOrder = ({
|
|||||||
<TableRow modifier="bordered">
|
<TableRow modifier="bordered">
|
||||||
<TableCell>{t('Iceberg details')}</TableCell>
|
<TableCell>{t('Iceberg details')}</TableCell>
|
||||||
<TableCell>
|
<TableCell>
|
||||||
<TxOrderIcebergDetails
|
<TxOrderIcebergDetails iceberg={iceberg} size={size} />
|
||||||
iceberg={iceberg}
|
|
||||||
size={size}
|
|
||||||
marketId={marketId}
|
|
||||||
/>
|
|
||||||
</TableCell>
|
</TableCell>
|
||||||
</TableRow>
|
</TableRow>
|
||||||
) : null}
|
) : null}
|
||||||
|
|||||||
@@ -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}
|
||||||
|
|||||||
@@ -1,60 +0,0 @@
|
|||||||
import { t } from '@vegaprotocol/i18n';
|
|
||||||
import type { BlockExplorerTransactionResult } from '../../../routes/types/block-explorer-response';
|
|
||||||
import { MarketLink } from '../../links/';
|
|
||||||
import type { TendermintBlocksResponse } from '../../../routes/blocks/tendermint-blocks-response';
|
|
||||||
import { TxDetailsShared } from './shared/tx-details-shared';
|
|
||||||
import { TableCell, TableRow, TableWithTbody } from '../../table';
|
|
||||||
import { CancelSummary } from '../../order-summary/order-cancellation';
|
|
||||||
import Hash from '../../links/hash';
|
|
||||||
import type { components } from '../../../../types/explorer';
|
|
||||||
|
|
||||||
export type StopOrderCancellationTransaction =
|
|
||||||
components['schemas']['v1StopOrdersCancellation'];
|
|
||||||
|
|
||||||
interface TxDetailsStopOrderCancelProps {
|
|
||||||
txData: BlockExplorerTransactionResult | undefined;
|
|
||||||
pubKey: string | undefined;
|
|
||||||
blockData: TendermintBlocksResponse | undefined;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Someone cancelled a stop order
|
|
||||||
*/
|
|
||||||
export const TxDetailsStopOrderCancel = ({
|
|
||||||
txData,
|
|
||||||
pubKey,
|
|
||||||
blockData,
|
|
||||||
}: TxDetailsStopOrderCancelProps) => {
|
|
||||||
if (!txData || !txData.command) {
|
|
||||||
return <>{t('Awaiting Block Explorer transaction details')}</>;
|
|
||||||
}
|
|
||||||
|
|
||||||
const command: StopOrderCancellationTransaction =
|
|
||||||
txData.command.stopOrdersCancellation;
|
|
||||||
|
|
||||||
const { marketId, stopOrderId } = command;
|
|
||||||
|
|
||||||
return (
|
|
||||||
<TableWithTbody className="mb-8" allowWrap={true}>
|
|
||||||
<TxDetailsShared txData={txData} pubKey={pubKey} blockData={blockData} />
|
|
||||||
<TableRow modifier="bordered">
|
|
||||||
<TableCell>{t('Cancel stop order')}</TableCell>
|
|
||||||
<TableCell>
|
|
||||||
{stopOrderId ? (
|
|
||||||
<Hash text={stopOrderId} />
|
|
||||||
) : (
|
|
||||||
<CancelSummary orderId={stopOrderId} marketId={marketId} />
|
|
||||||
)}
|
|
||||||
</TableCell>
|
|
||||||
</TableRow>
|
|
||||||
{marketId ? (
|
|
||||||
<TableRow modifier="bordered">
|
|
||||||
<TableCell>{t('Market')}</TableCell>
|
|
||||||
<TableCell>
|
|
||||||
<MarketLink id={marketId} />
|
|
||||||
</TableCell>
|
|
||||||
</TableRow>
|
|
||||||
) : null}
|
|
||||||
</TableWithTbody>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
@@ -1,148 +0,0 @@
|
|||||||
import { t } from '@vegaprotocol/i18n';
|
|
||||||
import type { BlockExplorerTransactionResult } from '../../../routes/types/block-explorer-response';
|
|
||||||
import { MarketLink } from '../../links/';
|
|
||||||
import type { TendermintBlocksResponse } from '../../../routes/blocks/tendermint-blocks-response';
|
|
||||||
import { TxDetailsShared } from './shared/tx-details-shared';
|
|
||||||
import { TableCell, TableRow, TableWithTbody } from '../../table';
|
|
||||||
import {
|
|
||||||
getStopOrderIds,
|
|
||||||
stopOrdersSignatureToDeterministicId,
|
|
||||||
} from '../lib/deterministic-ids';
|
|
||||||
import type { components } from '../../../../types/explorer';
|
|
||||||
import { StopOrderSetup } from './order/stop-order-setup';
|
|
||||||
|
|
||||||
type StopOrderSetup = components['schemas']['v1StopOrderSetup'];
|
|
||||||
|
|
||||||
interface TxDetailsOrderProps {
|
|
||||||
txData: BlockExplorerTransactionResult | undefined;
|
|
||||||
pubKey: string | undefined;
|
|
||||||
blockData: TendermintBlocksResponse | undefined;
|
|
||||||
}
|
|
||||||
|
|
||||||
export function getStopTypeLabel(
|
|
||||||
risesAbove: StopOrderSetup | undefined,
|
|
||||||
fallsBelow: StopOrderSetup | undefined
|
|
||||||
): string {
|
|
||||||
if (risesAbove && fallsBelow) {
|
|
||||||
return t('OCO (One Cancels Other)');
|
|
||||||
} else if (fallsBelow) {
|
|
||||||
return t('Falls Below ↘');
|
|
||||||
} else if (risesAbove) {
|
|
||||||
return t('Rises Above ↗');
|
|
||||||
} else {
|
|
||||||
return t('Stop Order');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface StopMarketIdProps {
|
|
||||||
risesAbove: StopOrderSetup | undefined;
|
|
||||||
fallsBelow: StopOrderSetup | undefined;
|
|
||||||
showMarketName?: boolean;
|
|
||||||
}
|
|
||||||
|
|
||||||
export function StopMarketId({
|
|
||||||
risesAbove,
|
|
||||||
fallsBelow,
|
|
||||||
showMarketName = false,
|
|
||||||
}: StopMarketIdProps) {
|
|
||||||
const raMarketId = risesAbove?.orderSubmission?.marketId;
|
|
||||||
const fbMarketId = fallsBelow?.orderSubmission?.marketId;
|
|
||||||
|
|
||||||
if (raMarketId && fbMarketId) {
|
|
||||||
if (raMarketId === fbMarketId) {
|
|
||||||
return <MarketLink id={raMarketId} showMarketName={showMarketName} />;
|
|
||||||
} else {
|
|
||||||
return (
|
|
||||||
<>
|
|
||||||
<MarketLink id={raMarketId} showMarketName={showMarketName} />,
|
|
||||||
<MarketLink id={fbMarketId} showMarketName={showMarketName} />
|
|
||||||
</>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
} else if (raMarketId) {
|
|
||||||
return <MarketLink id={raMarketId} showMarketName={showMarketName} />;
|
|
||||||
} else if (fbMarketId) {
|
|
||||||
return <MarketLink id={fbMarketId} showMarketName={showMarketName} />;
|
|
||||||
} else {
|
|
||||||
return '-';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*/
|
|
||||||
export const TxDetailsStopOrderSubmission = ({
|
|
||||||
txData,
|
|
||||||
pubKey,
|
|
||||||
blockData,
|
|
||||||
}: TxDetailsOrderProps) => {
|
|
||||||
if (!txData || !txData.command.stopOrdersSubmission) {
|
|
||||||
return <>{t('Awaiting Block Explorer transaction details')}</>;
|
|
||||||
}
|
|
||||||
|
|
||||||
const tx: components['schemas']['v1StopOrdersSubmission'] =
|
|
||||||
txData.command.stopOrdersSubmission;
|
|
||||||
|
|
||||||
const orderIds = stopOrdersSignatureToDeterministicId(
|
|
||||||
txData?.signature?.value
|
|
||||||
);
|
|
||||||
|
|
||||||
const { risesAboveId, fallsBelowId } = getStopOrderIds(
|
|
||||||
orderIds,
|
|
||||||
tx.risesAbove,
|
|
||||||
tx.fallsBelow
|
|
||||||
);
|
|
||||||
|
|
||||||
return (
|
|
||||||
<>
|
|
||||||
<TableWithTbody className="mb-8" allowWrap={true}>
|
|
||||||
<TxDetailsShared
|
|
||||||
txData={txData}
|
|
||||||
pubKey={pubKey}
|
|
||||||
blockData={blockData}
|
|
||||||
/>
|
|
||||||
<TableRow modifier="bordered">
|
|
||||||
<TableCell>{t('Market ID')}</TableCell>
|
|
||||||
<TableCell>
|
|
||||||
<StopMarketId
|
|
||||||
risesAbove={tx.risesAbove}
|
|
||||||
fallsBelow={tx.fallsBelow}
|
|
||||||
/>
|
|
||||||
</TableCell>
|
|
||||||
</TableRow>
|
|
||||||
<TableRow modifier="bordered">
|
|
||||||
<TableCell>{t('Market')}</TableCell>
|
|
||||||
<TableCell>
|
|
||||||
<StopMarketId
|
|
||||||
risesAbove={tx.risesAbove}
|
|
||||||
fallsBelow={tx.fallsBelow}
|
|
||||||
showMarketName={true}
|
|
||||||
/>
|
|
||||||
</TableCell>
|
|
||||||
</TableRow>
|
|
||||||
<TableRow modifier="bordered">
|
|
||||||
<TableCell>{t('Trigger')}</TableCell>
|
|
||||||
<TableCell>
|
|
||||||
{getStopTypeLabel(tx.risesAbove, tx.fallsBelow)}
|
|
||||||
</TableCell>
|
|
||||||
</TableRow>
|
|
||||||
</TableWithTbody>
|
|
||||||
<div className="flex gap-2">
|
|
||||||
{tx.fallsBelow && fallsBelowId && (
|
|
||||||
<StopOrderSetup
|
|
||||||
type={'FallsBelow'}
|
|
||||||
{...tx.fallsBelow}
|
|
||||||
deterministicId={fallsBelowId}
|
|
||||||
/>
|
|
||||||
)}
|
|
||||||
|
|
||||||
{tx.risesAbove && risesAboveId && (
|
|
||||||
<StopOrderSetup
|
|
||||||
type={'RisesAbove'}
|
|
||||||
{...tx.risesAbove}
|
|
||||||
deterministicId={risesAboveId}
|
|
||||||
/>
|
|
||||||
)}
|
|
||||||
</div>
|
|
||||||
</>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
@@ -1,8 +1,4 @@
|
|||||||
import {
|
import { hexToString, txSignatureToDeterministicId } from './deterministic-ids';
|
||||||
hexToString,
|
|
||||||
txSignatureToDeterministicId,
|
|
||||||
stopOrdersSignatureToDeterministicId,
|
|
||||||
} from './deterministic-ids';
|
|
||||||
|
|
||||||
it('txSignatureToDeterministicId Turns a known signature in to a known deterministic ID', () => {
|
it('txSignatureToDeterministicId Turns a known signature in to a known deterministic ID', () => {
|
||||||
const signature =
|
const signature =
|
||||||
@@ -24,24 +20,3 @@ it('hexToString encodes a known good value as bytes', () => {
|
|||||||
const res = hexToString(hex);
|
const res = hexToString(hex);
|
||||||
expect(res).toEqual([14, 221]);
|
expect(res).toEqual([14, 221]);
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('stopOrdersSignatureToDeterministicId', () => {
|
|
||||||
it('should return empty object if no signature is provided', () => {
|
|
||||||
const result = stopOrdersSignatureToDeterministicId();
|
|
||||||
expect(result.length).toEqual(0);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should return valid deterministic ids if a signature is provided', () => {
|
|
||||||
const signature = 'deadb33f';
|
|
||||||
const result = stopOrdersSignatureToDeterministicId(signature);
|
|
||||||
|
|
||||||
expect(result.length).toEqual(2);
|
|
||||||
|
|
||||||
expect(result[0]).toBe(
|
|
||||||
'4c45b67a8c08cbf1982883a75beaf309bf172461d04bd427623d6cd3d9ab0e91'
|
|
||||||
);
|
|
||||||
expect(result[1]).toBe(
|
|
||||||
'afe7509ff90d8f26339a0ab81e4d3e1fb6c4d44e94419aa5e13ae7659d894da1'
|
|
||||||
);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
import type { components } from '../../../../types/explorer';
|
|
||||||
import { sha3_256 } from 'js-sha3';
|
import { sha3_256 } from 'js-sha3';
|
||||||
type StopOrderSetup = components['schemas']['v1StopOrderSetup'];
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Encodes a string as bytes
|
* Encodes a string as bytes
|
||||||
@@ -39,58 +37,3 @@ export function txSignatureToDeterministicId(signature: string): string {
|
|||||||
|
|
||||||
return hash.hex();
|
return hash.hex();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Given a stop order signature string, returns the deterministic IDs of both potential
|
|
||||||
* Stop Orders. A stop order is not an order per se, but a trigger for an order. The order
|
|
||||||
* created by the stop order will have another ID based on the market event that hit the
|
|
||||||
* trigger, and as such is not deterministic.
|
|
||||||
*
|
|
||||||
* @param signature
|
|
||||||
* @returns string[]
|
|
||||||
*/
|
|
||||||
export function stopOrdersSignatureToDeterministicId(
|
|
||||||
signature?: string
|
|
||||||
): string[] {
|
|
||||||
if (!signature) {
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
|
|
||||||
const firstId = txSignatureToDeterministicId(signature);
|
|
||||||
return [firstId, txSignatureToDeterministicId(firstId)];
|
|
||||||
}
|
|
||||||
|
|
||||||
export type stopSignatures = {
|
|
||||||
risesAboveId: string | undefined;
|
|
||||||
fallsBelowId: string | undefined;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* In 0.72.10 the way stop order IDs are determined is a little tricky. It will be stabilised
|
|
||||||
* in a future release.
|
|
||||||
* @param deterministicIds Output of stopORdersSignatureToDeterministicId
|
|
||||||
* @param risesAbove Stop order setup
|
|
||||||
* @param fallsBelow Stop order setup
|
|
||||||
* @returns Object containing the deterministic IDs of the stop orders
|
|
||||||
*/
|
|
||||||
export function getStopOrderIds(
|
|
||||||
deterministicIds: string[],
|
|
||||||
risesAbove: StopOrderSetup | undefined,
|
|
||||||
fallsBelow: StopOrderSetup | undefined
|
|
||||||
) {
|
|
||||||
if (risesAbove && fallsBelow) {
|
|
||||||
return {
|
|
||||||
risesAboveId: deterministicIds[0],
|
|
||||||
fallsBelowId: deterministicIds[1],
|
|
||||||
};
|
|
||||||
} else if (!fallsBelow && risesAbove) {
|
|
||||||
return {
|
|
||||||
risesAboveId: deterministicIds[0],
|
|
||||||
};
|
|
||||||
} else {
|
|
||||||
return {
|
|
||||||
fallsBelowId: deterministicIds[0] || undefined,
|
|
||||||
risesAboveId: deterministicIds[1] || undefined,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -34,8 +34,6 @@ export type FilterOption =
|
|||||||
| 'Protocol Upgrade'
|
| 'Protocol Upgrade'
|
||||||
| 'Register new Node'
|
| 'Register new Node'
|
||||||
| 'State Variable Proposal'
|
| 'State Variable Proposal'
|
||||||
| 'Stop Orders Submission'
|
|
||||||
| 'Stop Orders Cancellation'
|
|
||||||
| 'Submit Oracle Data'
|
| 'Submit Oracle Data'
|
||||||
| 'Submit Order'
|
| 'Submit Order'
|
||||||
| 'Transfer Funds'
|
| 'Transfer Funds'
|
||||||
@@ -55,8 +53,6 @@ export const PrimaryFilterOptions: FilterOption[] = [
|
|||||||
'Delegate',
|
'Delegate',
|
||||||
'Liquidity Provision Order',
|
'Liquidity Provision Order',
|
||||||
'Proposal',
|
'Proposal',
|
||||||
'Stop Orders Submission',
|
|
||||||
'Stop Orders Cancellation',
|
|
||||||
'Submit Oracle Data',
|
'Submit Oracle Data',
|
||||||
'Submit Order',
|
'Submit Order',
|
||||||
'Transfer Funds',
|
'Transfer Funds',
|
||||||
|
|||||||
@@ -50,25 +50,6 @@ const displayString: StringMap = {
|
|||||||
'Stop Orders Cancellation': 'Cancel stop',
|
'Stop Orders Cancellation': 'Cancel stop',
|
||||||
};
|
};
|
||||||
|
|
||||||
export function getLabelForStopOrderType(
|
|
||||||
orderType: string,
|
|
||||||
command: components['schemas']['v1InputData']
|
|
||||||
): string {
|
|
||||||
if (command.stopOrdersSubmission) {
|
|
||||||
if (
|
|
||||||
command.stopOrdersSubmission.risesAbove &&
|
|
||||||
command.stopOrdersSubmission.fallsBelow
|
|
||||||
) {
|
|
||||||
return 'Stop ⇅';
|
|
||||||
} else if (command.stopOrdersSubmission.risesAbove) {
|
|
||||||
return 'Stop ↗';
|
|
||||||
} else if (command.stopOrdersSubmission.fallsBelow) {
|
|
||||||
return 'Stop ↘';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 'Stop';
|
|
||||||
}
|
|
||||||
|
|
||||||
export function getLabelForOrderType(
|
export function getLabelForOrderType(
|
||||||
orderType: string,
|
orderType: string,
|
||||||
command: components['schemas']['v1InputData']
|
command: components['schemas']['v1InputData']
|
||||||
@@ -97,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) {
|
||||||
@@ -204,9 +181,6 @@ export const TxOrderType = ({ orderType, command }: TxOrderTypeProps) => {
|
|||||||
} else if (type === 'Order' && command) {
|
} else if (type === 'Order' && command) {
|
||||||
type = getLabelForOrderType(orderType, command);
|
type = getLabelForOrderType(orderType, command);
|
||||||
colours = 'text-white dark-text-white bg-vega-blue dark:bg-vega-blue';
|
colours = 'text-white dark-text-white bg-vega-blue dark:bg-vega-blue';
|
||||||
} else if (type === 'Stop' && command) {
|
|
||||||
type = getLabelForStopOrderType(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') {
|
||||||
|
|||||||
@@ -55,7 +55,7 @@ export const TxsInfiniteList = ({
|
|||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div>
|
<div className="overflow-scroll">
|
||||||
<table className={className} data-testid="transactions-list">
|
<table className={className} data-testid="transactions-list">
|
||||||
<thead>
|
<thead>
|
||||||
<tr className="w-full mb-3 text-vega-dark-300 uppercase text-left">
|
<tr className="w-full mb-3 text-vega-dark-300 uppercase text-left">
|
||||||
|
|||||||
@@ -22,11 +22,6 @@ import { Footer } from '../components/footer/footer';
|
|||||||
import { Header } from '../components/header';
|
import { Header } from '../components/header';
|
||||||
import { Routes } from './route-names';
|
import { Routes } from './route-names';
|
||||||
import { useExplorerNodeNamesLazyQuery } from './validators/__generated__/NodeNames';
|
import { useExplorerNodeNamesLazyQuery } from './validators/__generated__/NodeNames';
|
||||||
import {
|
|
||||||
ProtocolUpgradeCountdownMode,
|
|
||||||
ProtocolUpgradeInProgressNotification,
|
|
||||||
ProtocolUpgradeProposalNotification,
|
|
||||||
} from '@vegaprotocol/proposals';
|
|
||||||
|
|
||||||
const DialogsContainer = () => {
|
const DialogsContainer = () => {
|
||||||
const { isOpen, id, trigger, asJson, setOpen } = useAssetDetailsDialogStore();
|
const { isOpen, id, trigger, asJson, setOpen } = useAssetDetailsDialogStore();
|
||||||
@@ -67,10 +62,6 @@ export const Layout = () => {
|
|||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
<Header />
|
<Header />
|
||||||
<ProtocolUpgradeProposalNotification
|
|
||||||
mode={ProtocolUpgradeCountdownMode.IN_ESTIMATED_TIME_REMAINING}
|
|
||||||
/>
|
|
||||||
<ProtocolUpgradeInProgressNotification />
|
|
||||||
</div>
|
</div>
|
||||||
<div className={fixedWidthClasses}>
|
<div className={fixedWidthClasses}>
|
||||||
<main className="p-4">
|
<main className="p-4">
|
||||||
|
|||||||
@@ -1,34 +1,4 @@
|
|||||||
fragment ExplorerOracleDataConnection on OracleSpec {
|
|
||||||
dataConnection {
|
|
||||||
edges {
|
|
||||||
node {
|
|
||||||
externalData {
|
|
||||||
data {
|
|
||||||
signers {
|
|
||||||
signer {
|
|
||||||
... on ETHAddress {
|
|
||||||
address
|
|
||||||
}
|
|
||||||
... on PubKey {
|
|
||||||
key
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
data {
|
|
||||||
name
|
|
||||||
value
|
|
||||||
}
|
|
||||||
matchedSpecIds
|
|
||||||
broadcastAt
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fragment ExplorerOracleDataSource on OracleSpec {
|
fragment ExplorerOracleDataSource on OracleSpec {
|
||||||
...ExplorerOracleDataConnection
|
|
||||||
dataSourceSpec {
|
dataSourceSpec {
|
||||||
spec {
|
spec {
|
||||||
id
|
id
|
||||||
@@ -64,7 +34,6 @@ fragment ExplorerOracleDataSource on OracleSpec {
|
|||||||
key {
|
key {
|
||||||
name
|
name
|
||||||
type
|
type
|
||||||
numberDecimalPlaces
|
|
||||||
}
|
}
|
||||||
conditions {
|
conditions {
|
||||||
value
|
value
|
||||||
@@ -80,6 +49,38 @@ fragment ExplorerOracleDataSource on OracleSpec {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fragment ExplorerOracleDataConnection on OracleSpec {
|
||||||
|
dataConnection {
|
||||||
|
pageInfo {
|
||||||
|
hasNextPage
|
||||||
|
}
|
||||||
|
edges {
|
||||||
|
node {
|
||||||
|
externalData {
|
||||||
|
data {
|
||||||
|
signers {
|
||||||
|
signer {
|
||||||
|
... on ETHAddress {
|
||||||
|
address
|
||||||
|
}
|
||||||
|
... on PubKey {
|
||||||
|
key
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
data {
|
||||||
|
name
|
||||||
|
value
|
||||||
|
}
|
||||||
|
matchedSpecIds
|
||||||
|
broadcastAt
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
query ExplorerOracleSpecs {
|
query ExplorerOracleSpecs {
|
||||||
oracleSpecsConnection(pagination: { first: 50 }) {
|
oracleSpecsConnection(pagination: { first: 50 }) {
|
||||||
pageInfo {
|
pageInfo {
|
||||||
@@ -96,5 +97,6 @@ query ExplorerOracleSpecs {
|
|||||||
query ExplorerOracleSpecById($id: ID!) {
|
query ExplorerOracleSpecById($id: ID!) {
|
||||||
oracleSpec(oracleSpecId: $id) {
|
oracleSpec(oracleSpecId: $id) {
|
||||||
...ExplorerOracleDataSource
|
...ExplorerOracleDataSource
|
||||||
|
...ExplorerOracleDataConnection
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+41
-38
@@ -3,55 +3,24 @@ import * as Types from '@vegaprotocol/types';
|
|||||||
import { gql } from '@apollo/client';
|
import { gql } from '@apollo/client';
|
||||||
import * as Apollo from '@apollo/client';
|
import * as Apollo from '@apollo/client';
|
||||||
const defaultOptions = {} as const;
|
const defaultOptions = {} as const;
|
||||||
export type ExplorerOracleDataConnectionFragment = { __typename?: 'OracleSpec', dataConnection: { __typename?: 'OracleDataConnection', edges?: Array<{ __typename?: 'OracleDataEdge', node: { __typename?: 'OracleData', externalData: { __typename?: 'ExternalData', data: { __typename?: 'Data', matchedSpecIds?: Array<string> | null, broadcastAt: any, signers?: Array<{ __typename?: 'Signer', signer: { __typename?: 'ETHAddress', address?: string | null } | { __typename?: 'PubKey', key?: string | null } }> | null, data?: Array<{ __typename?: 'Property', name: string, value: string }> | null } } } } | null> | null } };
|
export type ExplorerOracleDataSourceFragment = { __typename?: 'OracleSpec', dataSourceSpec: { __typename?: 'ExternalDataSourceSpec', spec: { __typename?: 'DataSourceSpec', id: string, createdAt: any, updatedAt?: any | null, status: Types.DataSourceSpecStatus, data: { __typename?: 'DataSourceDefinition', sourceType: { __typename?: 'DataSourceDefinitionExternal', sourceType: { __typename?: 'DataSourceSpecConfiguration', signers?: Array<{ __typename?: 'Signer', signer: { __typename?: 'ETHAddress', address?: string | null } | { __typename?: 'PubKey', key?: string | null } }> | null, filters?: Array<{ __typename?: 'Filter', key: { __typename?: 'PropertyKey', name?: string | null, type: Types.PropertyKeyType }, conditions?: Array<{ __typename?: 'Condition', value?: string | null, operator: Types.ConditionOperator }> | null }> | null } } | { __typename?: 'DataSourceDefinitionInternal', sourceType: { __typename?: 'DataSourceSpecConfigurationTime', conditions: Array<{ __typename?: 'Condition', value?: string | null, operator: Types.ConditionOperator } | null> } } } } } };
|
||||||
|
|
||||||
export type ExplorerOracleDataSourceFragment = { __typename?: 'OracleSpec', dataSourceSpec: { __typename?: 'ExternalDataSourceSpec', spec: { __typename?: 'DataSourceSpec', id: string, createdAt: any, updatedAt?: any | null, status: Types.DataSourceSpecStatus, data: { __typename?: 'DataSourceDefinition', sourceType: { __typename?: 'DataSourceDefinitionExternal', sourceType: { __typename?: 'DataSourceSpecConfiguration', signers?: Array<{ __typename?: 'Signer', signer: { __typename?: 'ETHAddress', address?: string | null } | { __typename?: 'PubKey', key?: string | null } }> | null, filters?: Array<{ __typename?: 'Filter', key: { __typename?: 'PropertyKey', name?: string | null, type: Types.PropertyKeyType, numberDecimalPlaces?: number | null }, conditions?: Array<{ __typename?: 'Condition', value?: string | null, operator: Types.ConditionOperator }> | null }> | null } } | { __typename?: 'DataSourceDefinitionInternal', sourceType: { __typename?: 'DataSourceSpecConfigurationTime', conditions: Array<{ __typename?: 'Condition', value?: string | null, operator: Types.ConditionOperator } | null> } } } } }, dataConnection: { __typename?: 'OracleDataConnection', edges?: Array<{ __typename?: 'OracleDataEdge', node: { __typename?: 'OracleData', externalData: { __typename?: 'ExternalData', data: { __typename?: 'Data', matchedSpecIds?: Array<string> | null, broadcastAt: any, signers?: Array<{ __typename?: 'Signer', signer: { __typename?: 'ETHAddress', address?: string | null } | { __typename?: 'PubKey', key?: string | null } }> | null, data?: Array<{ __typename?: 'Property', name: string, value: string }> | null } } } } | null> | null } };
|
export type ExplorerOracleDataConnectionFragment = { __typename?: 'OracleSpec', dataConnection: { __typename?: 'OracleDataConnection', pageInfo: { __typename?: 'PageInfo', hasNextPage: boolean }, edges?: Array<{ __typename?: 'OracleDataEdge', node: { __typename?: 'OracleData', externalData: { __typename?: 'ExternalData', data: { __typename?: 'Data', matchedSpecIds?: Array<string> | null, broadcastAt: any, signers?: Array<{ __typename?: 'Signer', signer: { __typename?: 'ETHAddress', address?: string | null } | { __typename?: 'PubKey', key?: string | null } }> | null, data?: Array<{ __typename?: 'Property', name: string, value: string }> | null } } } } | null> | null } };
|
||||||
|
|
||||||
export type ExplorerOracleSpecsQueryVariables = Types.Exact<{ [key: string]: never; }>;
|
export type ExplorerOracleSpecsQueryVariables = Types.Exact<{ [key: string]: never; }>;
|
||||||
|
|
||||||
|
|
||||||
export type ExplorerOracleSpecsQuery = { __typename?: 'Query', oracleSpecsConnection?: { __typename?: 'OracleSpecsConnection', pageInfo: { __typename?: 'PageInfo', hasNextPage: boolean }, edges?: Array<{ __typename?: 'OracleSpecEdge', node: { __typename?: 'OracleSpec', dataSourceSpec: { __typename?: 'ExternalDataSourceSpec', spec: { __typename?: 'DataSourceSpec', id: string, createdAt: any, updatedAt?: any | null, status: Types.DataSourceSpecStatus, data: { __typename?: 'DataSourceDefinition', sourceType: { __typename?: 'DataSourceDefinitionExternal', sourceType: { __typename?: 'DataSourceSpecConfiguration', signers?: Array<{ __typename?: 'Signer', signer: { __typename?: 'ETHAddress', address?: string | null } | { __typename?: 'PubKey', key?: string | null } }> | null, filters?: Array<{ __typename?: 'Filter', key: { __typename?: 'PropertyKey', name?: string | null, type: Types.PropertyKeyType, numberDecimalPlaces?: number | null }, conditions?: Array<{ __typename?: 'Condition', value?: string | null, operator: Types.ConditionOperator }> | null }> | null } } | { __typename?: 'DataSourceDefinitionInternal', sourceType: { __typename?: 'DataSourceSpecConfigurationTime', conditions: Array<{ __typename?: 'Condition', value?: string | null, operator: Types.ConditionOperator } | null> } } } } }, dataConnection: { __typename?: 'OracleDataConnection', edges?: Array<{ __typename?: 'OracleDataEdge', node: { __typename?: 'OracleData', externalData: { __typename?: 'ExternalData', data: { __typename?: 'Data', matchedSpecIds?: Array<string> | null, broadcastAt: any, signers?: Array<{ __typename?: 'Signer', signer: { __typename?: 'ETHAddress', address?: string | null } | { __typename?: 'PubKey', key?: string | null } }> | null, data?: Array<{ __typename?: 'Property', name: string, value: string }> | null } } } } | null> | null } } } | null> | null } | null };
|
export type ExplorerOracleSpecsQuery = { __typename?: 'Query', oracleSpecsConnection?: { __typename?: 'OracleSpecsConnection', pageInfo: { __typename?: 'PageInfo', hasNextPage: boolean }, edges?: Array<{ __typename?: 'OracleSpecEdge', node: { __typename?: 'OracleSpec', dataSourceSpec: { __typename?: 'ExternalDataSourceSpec', spec: { __typename?: 'DataSourceSpec', id: string, createdAt: any, updatedAt?: any | null, status: Types.DataSourceSpecStatus, data: { __typename?: 'DataSourceDefinition', sourceType: { __typename?: 'DataSourceDefinitionExternal', sourceType: { __typename?: 'DataSourceSpecConfiguration', signers?: Array<{ __typename?: 'Signer', signer: { __typename?: 'ETHAddress', address?: string | null } | { __typename?: 'PubKey', key?: string | null } }> | null, filters?: Array<{ __typename?: 'Filter', key: { __typename?: 'PropertyKey', name?: string | null, type: Types.PropertyKeyType }, conditions?: Array<{ __typename?: 'Condition', value?: string | null, operator: Types.ConditionOperator }> | null }> | null } } | { __typename?: 'DataSourceDefinitionInternal', sourceType: { __typename?: 'DataSourceSpecConfigurationTime', conditions: Array<{ __typename?: 'Condition', value?: string | null, operator: Types.ConditionOperator } | null> } } } } } } } | null> | null } | null };
|
||||||
|
|
||||||
export type ExplorerOracleSpecByIdQueryVariables = Types.Exact<{
|
export type ExplorerOracleSpecByIdQueryVariables = Types.Exact<{
|
||||||
id: Types.Scalars['ID'];
|
id: Types.Scalars['ID'];
|
||||||
}>;
|
}>;
|
||||||
|
|
||||||
|
|
||||||
export type ExplorerOracleSpecByIdQuery = { __typename?: 'Query', oracleSpec?: { __typename?: 'OracleSpec', dataSourceSpec: { __typename?: 'ExternalDataSourceSpec', spec: { __typename?: 'DataSourceSpec', id: string, createdAt: any, updatedAt?: any | null, status: Types.DataSourceSpecStatus, data: { __typename?: 'DataSourceDefinition', sourceType: { __typename?: 'DataSourceDefinitionExternal', sourceType: { __typename?: 'DataSourceSpecConfiguration', signers?: Array<{ __typename?: 'Signer', signer: { __typename?: 'ETHAddress', address?: string | null } | { __typename?: 'PubKey', key?: string | null } }> | null, filters?: Array<{ __typename?: 'Filter', key: { __typename?: 'PropertyKey', name?: string | null, type: Types.PropertyKeyType, numberDecimalPlaces?: number | null }, conditions?: Array<{ __typename?: 'Condition', value?: string | null, operator: Types.ConditionOperator }> | null }> | null } } | { __typename?: 'DataSourceDefinitionInternal', sourceType: { __typename?: 'DataSourceSpecConfigurationTime', conditions: Array<{ __typename?: 'Condition', value?: string | null, operator: Types.ConditionOperator } | null> } } } } }, dataConnection: { __typename?: 'OracleDataConnection', edges?: Array<{ __typename?: 'OracleDataEdge', node: { __typename?: 'OracleData', externalData: { __typename?: 'ExternalData', data: { __typename?: 'Data', matchedSpecIds?: Array<string> | null, broadcastAt: any, signers?: Array<{ __typename?: 'Signer', signer: { __typename?: 'ETHAddress', address?: string | null } | { __typename?: 'PubKey', key?: string | null } }> | null, data?: Array<{ __typename?: 'Property', name: string, value: string }> | null } } } } | null> | null } } | null };
|
export type ExplorerOracleSpecByIdQuery = { __typename?: 'Query', oracleSpec?: { __typename?: 'OracleSpec', dataSourceSpec: { __typename?: 'ExternalDataSourceSpec', spec: { __typename?: 'DataSourceSpec', id: string, createdAt: any, updatedAt?: any | null, status: Types.DataSourceSpecStatus, data: { __typename?: 'DataSourceDefinition', sourceType: { __typename?: 'DataSourceDefinitionExternal', sourceType: { __typename?: 'DataSourceSpecConfiguration', signers?: Array<{ __typename?: 'Signer', signer: { __typename?: 'ETHAddress', address?: string | null } | { __typename?: 'PubKey', key?: string | null } }> | null, filters?: Array<{ __typename?: 'Filter', key: { __typename?: 'PropertyKey', name?: string | null, type: Types.PropertyKeyType }, conditions?: Array<{ __typename?: 'Condition', value?: string | null, operator: Types.ConditionOperator }> | null }> | null } } | { __typename?: 'DataSourceDefinitionInternal', sourceType: { __typename?: 'DataSourceSpecConfigurationTime', conditions: Array<{ __typename?: 'Condition', value?: string | null, operator: Types.ConditionOperator } | null> } } } } }, dataConnection: { __typename?: 'OracleDataConnection', pageInfo: { __typename?: 'PageInfo', hasNextPage: boolean }, edges?: Array<{ __typename?: 'OracleDataEdge', node: { __typename?: 'OracleData', externalData: { __typename?: 'ExternalData', data: { __typename?: 'Data', matchedSpecIds?: Array<string> | null, broadcastAt: any, signers?: Array<{ __typename?: 'Signer', signer: { __typename?: 'ETHAddress', address?: string | null } | { __typename?: 'PubKey', key?: string | null } }> | null, data?: Array<{ __typename?: 'Property', name: string, value: string }> | null } } } } | null> | null } } | null };
|
||||||
|
|
||||||
export const ExplorerOracleDataConnectionFragmentDoc = gql`
|
|
||||||
fragment ExplorerOracleDataConnection on OracleSpec {
|
|
||||||
dataConnection {
|
|
||||||
edges {
|
|
||||||
node {
|
|
||||||
externalData {
|
|
||||||
data {
|
|
||||||
signers {
|
|
||||||
signer {
|
|
||||||
... on ETHAddress {
|
|
||||||
address
|
|
||||||
}
|
|
||||||
... on PubKey {
|
|
||||||
key
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
data {
|
|
||||||
name
|
|
||||||
value
|
|
||||||
}
|
|
||||||
matchedSpecIds
|
|
||||||
broadcastAt
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
`;
|
|
||||||
export const ExplorerOracleDataSourceFragmentDoc = gql`
|
export const ExplorerOracleDataSourceFragmentDoc = gql`
|
||||||
fragment ExplorerOracleDataSource on OracleSpec {
|
fragment ExplorerOracleDataSource on OracleSpec {
|
||||||
...ExplorerOracleDataConnection
|
|
||||||
dataSourceSpec {
|
dataSourceSpec {
|
||||||
spec {
|
spec {
|
||||||
id
|
id
|
||||||
@@ -87,7 +56,6 @@ export const ExplorerOracleDataSourceFragmentDoc = gql`
|
|||||||
key {
|
key {
|
||||||
name
|
name
|
||||||
type
|
type
|
||||||
numberDecimalPlaces
|
|
||||||
}
|
}
|
||||||
conditions {
|
conditions {
|
||||||
value
|
value
|
||||||
@@ -102,7 +70,40 @@ export const ExplorerOracleDataSourceFragmentDoc = gql`
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
${ExplorerOracleDataConnectionFragmentDoc}`;
|
`;
|
||||||
|
export const ExplorerOracleDataConnectionFragmentDoc = gql`
|
||||||
|
fragment ExplorerOracleDataConnection on OracleSpec {
|
||||||
|
dataConnection {
|
||||||
|
pageInfo {
|
||||||
|
hasNextPage
|
||||||
|
}
|
||||||
|
edges {
|
||||||
|
node {
|
||||||
|
externalData {
|
||||||
|
data {
|
||||||
|
signers {
|
||||||
|
signer {
|
||||||
|
... on ETHAddress {
|
||||||
|
address
|
||||||
|
}
|
||||||
|
... on PubKey {
|
||||||
|
key
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
data {
|
||||||
|
name
|
||||||
|
value
|
||||||
|
}
|
||||||
|
matchedSpecIds
|
||||||
|
broadcastAt
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`;
|
||||||
export const ExplorerOracleSpecsDocument = gql`
|
export const ExplorerOracleSpecsDocument = gql`
|
||||||
query ExplorerOracleSpecs {
|
query ExplorerOracleSpecs {
|
||||||
oracleSpecsConnection(pagination: {first: 50}) {
|
oracleSpecsConnection(pagination: {first: 50}) {
|
||||||
@@ -148,9 +149,11 @@ export const ExplorerOracleSpecByIdDocument = gql`
|
|||||||
query ExplorerOracleSpecById($id: ID!) {
|
query ExplorerOracleSpecById($id: ID!) {
|
||||||
oracleSpec(oracleSpecId: $id) {
|
oracleSpec(oracleSpecId: $id) {
|
||||||
...ExplorerOracleDataSource
|
...ExplorerOracleDataSource
|
||||||
|
...ExplorerOracleDataConnection
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
${ExplorerOracleDataSourceFragmentDoc}`;
|
${ExplorerOracleDataSourceFragmentDoc}
|
||||||
|
${ExplorerOracleDataConnectionFragmentDoc}`;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* __useExplorerOracleSpecByIdQuery__
|
* __useExplorerOracleSpecByIdQuery__
|
||||||
|
|||||||
@@ -1,23 +1,23 @@
|
|||||||
import { render } from '@testing-library/react';
|
import { render } from '@testing-library/react';
|
||||||
import { OracleData } from './oracle-data';
|
import { OracleData } from './oracle-data';
|
||||||
import { type ExplorerOracleDataConnectionFragment } from '../__generated__/Oracles';
|
import type { ExplorerOracleDataConnectionFragment } from '../__generated__/Oracles';
|
||||||
|
|
||||||
type DataConnection = ExplorerOracleDataConnectionFragment['dataConnection'];
|
function renderComponent(data: ExplorerOracleDataConnectionFragment) {
|
||||||
|
|
||||||
function renderComponent(
|
|
||||||
data: ExplorerOracleDataConnectionFragment['dataConnection']
|
|
||||||
) {
|
|
||||||
return <OracleData data={data} />;
|
return <OracleData data={data} />;
|
||||||
}
|
}
|
||||||
|
|
||||||
describe('Oracle Data view', () => {
|
describe('Oracle Data view', () => {
|
||||||
it('Renders nothing when data is null', () => {
|
it('Renders nothing when data is null', () => {
|
||||||
const res = render(renderComponent(null as unknown as DataConnection));
|
const res = render(
|
||||||
|
renderComponent(null as unknown as ExplorerOracleDataConnectionFragment)
|
||||||
|
);
|
||||||
expect(res.container).toBeEmptyDOMElement();
|
expect(res.container).toBeEmptyDOMElement();
|
||||||
});
|
});
|
||||||
|
|
||||||
it('Renders nothing when dataConnection is empty', () => {
|
it('Renders nothing when dataConnection is empty', () => {
|
||||||
const res = render(renderComponent({} as DataConnection));
|
const res = render(
|
||||||
|
renderComponent({} as ExplorerOracleDataConnectionFragment)
|
||||||
|
);
|
||||||
expect(res.container).toBeEmptyDOMElement();
|
expect(res.container).toBeEmptyDOMElement();
|
||||||
});
|
});
|
||||||
it('Renders nothing when dataConnection has no edges', () => {
|
it('Renders nothing when dataConnection has no edges', () => {
|
||||||
@@ -26,7 +26,7 @@ describe('Oracle Data view', () => {
|
|||||||
dataConnection: {
|
dataConnection: {
|
||||||
edges: null,
|
edges: null,
|
||||||
},
|
},
|
||||||
} as DataConnection)
|
} as ExplorerOracleDataConnectionFragment)
|
||||||
);
|
);
|
||||||
expect(res.container).toBeEmptyDOMElement();
|
expect(res.container).toBeEmptyDOMElement();
|
||||||
});
|
});
|
||||||
@@ -37,7 +37,7 @@ describe('Oracle Data view', () => {
|
|||||||
dataConnection: {
|
dataConnection: {
|
||||||
edges: [],
|
edges: [],
|
||||||
},
|
},
|
||||||
} as unknown as DataConnection)
|
} as unknown as ExplorerOracleDataConnectionFragment)
|
||||||
);
|
);
|
||||||
expect(res.container).toBeEmptyDOMElement();
|
expect(res.container).toBeEmptyDOMElement();
|
||||||
});
|
});
|
||||||
@@ -47,18 +47,20 @@ describe('Oracle Data view', () => {
|
|||||||
it('Renders details component when there is data', () => {
|
it('Renders details component when there is data', () => {
|
||||||
const res = render(
|
const res = render(
|
||||||
renderComponent({
|
renderComponent({
|
||||||
edges: [
|
dataConnection: {
|
||||||
{
|
edges: [
|
||||||
node: {
|
{
|
||||||
externalData: {
|
node: {
|
||||||
data: {
|
externalData: {
|
||||||
broadcastAt: '2022-01-01',
|
data: {
|
||||||
|
broadcastAt: '2022-01-01',
|
||||||
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
],
|
||||||
],
|
},
|
||||||
} as DataConnection)
|
} as ExplorerOracleDataConnectionFragment)
|
||||||
);
|
);
|
||||||
expect(res.getByText('Broadcast data')).toBeInTheDocument();
|
expect(res.getByText('Broadcast data')).toBeInTheDocument();
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import filter from 'recursive-key-filter';
|
|||||||
import type { ExplorerOracleDataConnectionFragment } from '../__generated__/Oracles';
|
import type { ExplorerOracleDataConnectionFragment } from '../__generated__/Oracles';
|
||||||
|
|
||||||
interface OracleDataTypeProps {
|
interface OracleDataTypeProps {
|
||||||
data: ExplorerOracleDataConnectionFragment['dataConnection'];
|
data: ExplorerOracleDataConnectionFragment;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -14,7 +14,12 @@ interface OracleDataTypeProps {
|
|||||||
* that Does The Job, rather than because it's good.
|
* that Does The Job, rather than because it's good.
|
||||||
*/
|
*/
|
||||||
export function OracleData({ data }: OracleDataTypeProps) {
|
export function OracleData({ data }: OracleDataTypeProps) {
|
||||||
if (!data || !data.edges?.length || data.edges.length > 1) {
|
if (
|
||||||
|
!data ||
|
||||||
|
!data.dataConnection ||
|
||||||
|
!data.dataConnection.edges?.length ||
|
||||||
|
data.dataConnection.edges.length > 1
|
||||||
|
) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -22,7 +27,7 @@ export function OracleData({ data }: OracleDataTypeProps) {
|
|||||||
<details data-testid="oracle-data">
|
<details data-testid="oracle-data">
|
||||||
<summary>{t('Broadcast data')}</summary>
|
<summary>{t('Broadcast data')}</summary>
|
||||||
<ul>
|
<ul>
|
||||||
{data.edges.map((d) => {
|
{data.dataConnection.edges.map((d) => {
|
||||||
if (!d) {
|
if (!d) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,8 +27,8 @@ export function OracleMarkets({ id }: OracleMarketsProps) {
|
|||||||
const m = markets.find((m) => {
|
const m = markets.find((m) => {
|
||||||
const p = m.tradableInstrument.instrument.product;
|
const p = m.tradableInstrument.instrument.product;
|
||||||
if (
|
if (
|
||||||
p?.dataSourceSpecForSettlementData?.id === id ||
|
p.dataSourceSpecForSettlementData.id === id ||
|
||||||
p?.dataSourceSpecForTradingTermination?.id === id
|
p.dataSourceSpecForTradingTermination.id === id
|
||||||
) {
|
) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -36,9 +36,15 @@ export function OracleMarkets({ id }: OracleMarketsProps) {
|
|||||||
});
|
});
|
||||||
|
|
||||||
if (m && m.id) {
|
if (m && m.id) {
|
||||||
|
const type =
|
||||||
|
id ===
|
||||||
|
m.tradableInstrument.instrument.product.dataSourceSpecForSettlementData
|
||||||
|
.id
|
||||||
|
? 'Settlement for'
|
||||||
|
: 'Termination for';
|
||||||
return (
|
return (
|
||||||
<TableRow modifier="bordered">
|
<TableRow modifier="bordered">
|
||||||
<TableHeader scope="row">{getLabel(id, m)}</TableHeader>
|
<TableHeader scope="row">{type}</TableHeader>
|
||||||
<TableCell modifier="bordered" data-testid={`m-${m.id}`}>
|
<TableCell modifier="bordered" data-testid={`m-${m.id}`}>
|
||||||
<MarketLink id={m.id} />
|
<MarketLink id={m.id} />
|
||||||
</TableCell>
|
</TableCell>
|
||||||
@@ -55,14 +61,3 @@ export function OracleMarkets({ id }: OracleMarketsProps) {
|
|||||||
</TableRow>
|
</TableRow>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getLabel(
|
|
||||||
id: string,
|
|
||||||
m: ExplorerOracleForMarketsMarketFragment | null
|
|
||||||
): string {
|
|
||||||
const settlementId =
|
|
||||||
m?.tradableInstrument?.instrument?.product?.dataSourceSpecForSettlementData
|
|
||||||
?.id || null;
|
|
||||||
|
|
||||||
return id === settlementId ? 'Settlement for' : 'Termination for';
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ export type SourceType =
|
|||||||
interface OracleDetailsProps {
|
interface OracleDetailsProps {
|
||||||
id: string;
|
id: string;
|
||||||
dataSource: ExplorerOracleDataSourceFragment;
|
dataSource: ExplorerOracleDataSourceFragment;
|
||||||
dataConnection: ExplorerOracleDataConnectionFragment['dataConnection'];
|
dataConnection?: ExplorerOracleDataConnectionFragment;
|
||||||
// Defaults to false. Hides the count of 'broadcasts' this oracle has seen
|
// Defaults to false. Hides the count of 'broadcasts' this oracle has seen
|
||||||
showBroadcasts?: boolean;
|
showBroadcasts?: boolean;
|
||||||
}
|
}
|
||||||
@@ -41,7 +41,8 @@ export const OracleDetails = ({
|
|||||||
showBroadcasts = false,
|
showBroadcasts = false,
|
||||||
}: OracleDetailsProps) => {
|
}: OracleDetailsProps) => {
|
||||||
const sourceType = dataSource.dataSourceSpec.spec.data.sourceType;
|
const sourceType = dataSource.dataSourceSpec.spec.data.sourceType;
|
||||||
const reportsCount: number = dataConnection.edges?.length || 0;
|
const reportsCount: number =
|
||||||
|
dataConnection?.dataConnection.edges?.length || 0;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
|
|||||||
@@ -34,15 +34,11 @@ const Oracles = () => {
|
|||||||
if (!id) {
|
if (!id) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
const dataConnection = o?.node.dataConnection;
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div id={id} key={id} className="mb-10">
|
<div id={id} key={id} className="mb-10">
|
||||||
<OracleDetails
|
<OracleDetails
|
||||||
id={id}
|
id={id}
|
||||||
dataSource={o?.node}
|
dataSource={o?.node}
|
||||||
dataConnection={dataConnection}
|
|
||||||
showBroadcasts={false}
|
showBroadcasts={false}
|
||||||
/>
|
/>
|
||||||
<details>
|
<details>
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ export const Oracle = () => {
|
|||||||
<OracleDetails
|
<OracleDetails
|
||||||
id={id || ''}
|
id={id || ''}
|
||||||
dataSource={data?.oracleSpec}
|
dataSource={data?.oracleSpec}
|
||||||
dataConnection={data?.oracleSpec.dataConnection}
|
dataConnection={data?.oracleSpec}
|
||||||
showBroadcasts={true}
|
showBroadcasts={true}
|
||||||
/>
|
/>
|
||||||
<details>
|
<details>
|
||||||
|
|||||||
@@ -48,11 +48,9 @@ query ExplorerPartyAssets($partyId: ID!) {
|
|||||||
}
|
}
|
||||||
stakingSummary {
|
stakingSummary {
|
||||||
currentStakeAvailable
|
currentStakeAvailable
|
||||||
linkings(pagination: { last: 100 }) {
|
linkings(pagination: { first: 100 }) {
|
||||||
edges {
|
edges {
|
||||||
node {
|
node {
|
||||||
type
|
|
||||||
status
|
|
||||||
amount
|
amount
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ export type ExplorerPartyAssetsQueryVariables = Types.Exact<{
|
|||||||
}>;
|
}>;
|
||||||
|
|
||||||
|
|
||||||
export type ExplorerPartyAssetsQuery = { __typename?: 'Query', partiesConnection?: { __typename?: 'PartyConnection', edges: Array<{ __typename?: 'PartyEdge', node: { __typename?: 'Party', id: string, delegationsConnection?: { __typename?: 'DelegationsConnection', edges?: Array<{ __typename?: 'DelegationEdge', node: { __typename?: 'Delegation', amount: string, epoch: number, node: { __typename?: 'Node', id: string, name: string } } } | null> | null } | null, stakingSummary: { __typename?: 'StakingSummary', currentStakeAvailable: string, linkings: { __typename?: 'StakesConnection', edges?: Array<{ __typename?: 'StakeLinkingEdge', node: { __typename?: 'StakeLinking', type: Types.StakeLinkingType, status: Types.StakeLinkingStatus, amount: string } } | null> | null } }, accountsConnection?: { __typename?: 'AccountsConnection', edges?: Array<{ __typename?: 'AccountEdge', node: { __typename?: 'AccountBalance', type: Types.AccountType, balance: string, asset: { __typename?: 'Asset', name: string, id: string, decimals: number, symbol: string, source: { __typename: 'BuiltinAsset' } | { __typename: 'ERC20', contractAddress: string } }, market?: { __typename?: 'Market', id: string, decimalPlaces: number, tradableInstrument: { __typename?: 'TradableInstrument', instrument: { __typename?: 'Instrument', name: string, product: { __typename?: 'Future', quoteName: string } } } } | null } } | null> | null } | null } }> } | null };
|
export type ExplorerPartyAssetsQuery = { __typename?: 'Query', partiesConnection?: { __typename?: 'PartyConnection', edges: Array<{ __typename?: 'PartyEdge', node: { __typename?: 'Party', id: string, delegationsConnection?: { __typename?: 'DelegationsConnection', edges?: Array<{ __typename?: 'DelegationEdge', node: { __typename?: 'Delegation', amount: string, epoch: number, node: { __typename?: 'Node', id: string, name: string } } } | null> | null } | null, stakingSummary: { __typename?: 'StakingSummary', currentStakeAvailable: string, linkings: { __typename?: 'StakesConnection', edges?: Array<{ __typename?: 'StakeLinkingEdge', node: { __typename?: 'StakeLinking', amount: string } } | null> | null } }, accountsConnection?: { __typename?: 'AccountsConnection', edges?: Array<{ __typename?: 'AccountEdge', node: { __typename?: 'AccountBalance', type: Types.AccountType, balance: string, asset: { __typename?: 'Asset', name: string, id: string, decimals: number, symbol: string, source: { __typename: 'BuiltinAsset' } | { __typename: 'ERC20', contractAddress: string } }, market?: { __typename?: 'Market', id: string, decimalPlaces: number, tradableInstrument: { __typename?: 'TradableInstrument', instrument: { __typename?: 'Instrument', name: string, product: { __typename?: 'Future', quoteName: string } } } } | null } } | null> | null } | null } }> } | null };
|
||||||
|
|
||||||
export const ExplorerPartyAssetsAccountsFragmentDoc = gql`
|
export const ExplorerPartyAssetsAccountsFragmentDoc = gql`
|
||||||
fragment ExplorerPartyAssetsAccounts on AccountBalance {
|
fragment ExplorerPartyAssetsAccounts on AccountBalance {
|
||||||
@@ -64,11 +64,9 @@ export const ExplorerPartyAssetsDocument = gql`
|
|||||||
}
|
}
|
||||||
stakingSummary {
|
stakingSummary {
|
||||||
currentStakeAvailable
|
currentStakeAvailable
|
||||||
linkings(pagination: {last: 100}) {
|
linkings(pagination: {first: 100}) {
|
||||||
edges {
|
edges {
|
||||||
node {
|
node {
|
||||||
type
|
|
||||||
status
|
|
||||||
amount
|
amount
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -42,15 +42,9 @@ export const PartyBlockStake = ({
|
|||||||
linkedLength && linkedLength > 0
|
linkedLength && linkedLength > 0
|
||||||
? p?.stakingSummary?.linkings?.edges
|
? p?.stakingSummary?.linkings?.edges
|
||||||
?.reduce((total, e) => {
|
?.reduce((total, e) => {
|
||||||
const accumulator = new BigNumber(total);
|
return new BigNumber(total).plus(
|
||||||
const diff = new BigNumber(e?.node.amount || 0);
|
new BigNumber(e?.node.amount || 0)
|
||||||
if (e?.node.type === 'TYPE_LINK') {
|
);
|
||||||
return accumulator.plus(diff);
|
|
||||||
} else if (e?.node.type === 'TYPE_UNLINK') {
|
|
||||||
return accumulator.minus(diff);
|
|
||||||
} else {
|
|
||||||
return accumulator;
|
|
||||||
}
|
|
||||||
}, new BigNumber(0))
|
}, new BigNumber(0))
|
||||||
.toString()
|
.toString()
|
||||||
: '0';
|
: '0';
|
||||||
|
|||||||
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">
|
||||||
|
|||||||
+1
-5
@@ -920,8 +920,6 @@ export interface components {
|
|||||||
* - ACCOUNT_TYPE_REWARD_LP_RECEIVED_FEES: Per asset reward account for fees received by liquidity providers
|
* - ACCOUNT_TYPE_REWARD_LP_RECEIVED_FEES: Per asset reward account for fees received by liquidity providers
|
||||||
* - ACCOUNT_TYPE_REWARD_MARKET_PROPOSERS: Per asset reward account for market proposers when the market goes above some trading threshold
|
* - ACCOUNT_TYPE_REWARD_MARKET_PROPOSERS: Per asset reward account for market proposers when the market goes above some trading threshold
|
||||||
* - ACCOUNT_TYPE_HOLDING: Per asset account for holding in-flight unfilled orders' funds
|
* - ACCOUNT_TYPE_HOLDING: Per asset account for holding in-flight unfilled orders' funds
|
||||||
* - ACCOUNT_TYPE_LP_LIQUIDITY_FEES: Network controlled liquidity provider's account, per market, to hold accrued liquidity fees.
|
|
||||||
* - ACCOUNT_TYPE_LIQUIDITY_FEES_BONUS_DISTRIBUTION: Network controlled liquidity fees bonus distribution account, per market.
|
|
||||||
* @default ACCOUNT_TYPE_UNSPECIFIED
|
* @default ACCOUNT_TYPE_UNSPECIFIED
|
||||||
* @enum {string}
|
* @enum {string}
|
||||||
*/
|
*/
|
||||||
@@ -943,9 +941,7 @@ export interface components {
|
|||||||
| 'ACCOUNT_TYPE_REWARD_MAKER_RECEIVED_FEES'
|
| 'ACCOUNT_TYPE_REWARD_MAKER_RECEIVED_FEES'
|
||||||
| 'ACCOUNT_TYPE_REWARD_LP_RECEIVED_FEES'
|
| 'ACCOUNT_TYPE_REWARD_LP_RECEIVED_FEES'
|
||||||
| 'ACCOUNT_TYPE_REWARD_MARKET_PROPOSERS'
|
| 'ACCOUNT_TYPE_REWARD_MARKET_PROPOSERS'
|
||||||
| 'ACCOUNT_TYPE_HOLDING'
|
| 'ACCOUNT_TYPE_HOLDING';
|
||||||
| 'ACCOUNT_TYPE_LP_LIQUIDITY_FEES'
|
|
||||||
| 'ACCOUNT_TYPE_LIQUIDITY_FEES_BONUS_DISTRIBUTION';
|
|
||||||
/** Vega representation of an external asset */
|
/** Vega representation of an external asset */
|
||||||
readonly vegaAssetDetails: {
|
readonly vegaAssetDetails: {
|
||||||
/** @description Vega built-in asset. */
|
/** @description Vega built-in asset. */
|
||||||
|
|||||||
@@ -18,11 +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
|
|
||||||
|
|
||||||
NX_VEGA_EXPLORER_URL=https://explorer.fairground.wtf
|
|
||||||
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
|
||||||
|
|||||||
@@ -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,12 +11,7 @@ import {
|
|||||||
getDateFormatForSpecifiedDays,
|
getDateFormatForSpecifiedDays,
|
||||||
getProposalFromTitle,
|
getProposalFromTitle,
|
||||||
getProposalInformationFromTable,
|
getProposalInformationFromTable,
|
||||||
goToMakeNewProposal,
|
|
||||||
governanceProposalType,
|
|
||||||
longProposalDescription,
|
|
||||||
proposalChangeType,
|
|
||||||
submitUniqueRawProposal,
|
submitUniqueRawProposal,
|
||||||
validateProposalDetailsDiff,
|
|
||||||
voteForProposal,
|
voteForProposal,
|
||||||
} from '../../../../governance-e2e/src/support/governance.functions';
|
} from '../../../../governance-e2e/src/support/governance.functions';
|
||||||
import {
|
import {
|
||||||
@@ -31,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,9 +39,9 @@ const proposalDetailsTitle = 'proposal-title';
|
|||||||
const proposalDetailsDescription = 'proposal-description';
|
const proposalDetailsDescription = 'proposal-description';
|
||||||
const openProposals = 'open-proposals';
|
const openProposals = 'open-proposals';
|
||||||
const viewProposalButton = 'view-proposal-btn';
|
const viewProposalButton = 'view-proposal-btn';
|
||||||
|
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',
|
||||||
@@ -57,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();
|
||||||
@@ -73,13 +66,10 @@ describe(
|
|||||||
|
|
||||||
// 3001-VOTE-050 3001-VOTE-054 3001-VOTE-055 3002-PROP-019
|
// 3001-VOTE-050 3001-VOTE-054 3001-VOTE-055 3002-PROP-019
|
||||||
it('Newly created raw proposal details - shows proposal title and full description', function () {
|
it('Newly created raw proposal details - shows proposal title and full description', function () {
|
||||||
const proposalDetails = longProposalDescription;
|
const proposalDescription =
|
||||||
|
'I propose that everyone evaluate the following IPFS document and vote Yes if they agree. bafybeigwwctpv37xdcwacqxvekr6e4kaemqsrv34em6glkbiceo3fcy4si';
|
||||||
|
|
||||||
goToMakeNewProposal(governanceProposalType.RAW);
|
createRawProposal();
|
||||||
submitUniqueRawProposal({
|
|
||||||
proposalTitle: 'raw proposal with long description',
|
|
||||||
proposalDescription: proposalDetails,
|
|
||||||
});
|
|
||||||
cy.get<testFreeformProposal>('@rawProposal').then((rawProposal) => {
|
cy.get<testFreeformProposal>('@rawProposal').then((rawProposal) => {
|
||||||
cy.getByTestId(openProposals).within(() => {
|
cy.getByTestId(openProposals).within(() => {
|
||||||
getProposalFromTitle(rawProposal.rationale.title).within(() => {
|
getProposalFromTitle(rawProposal.rationale.title).within(() => {
|
||||||
@@ -90,17 +80,12 @@ describe(
|
|||||||
'contain.text',
|
'contain.text',
|
||||||
rawProposal.rationale.title
|
rawProposal.rationale.title
|
||||||
);
|
);
|
||||||
|
cy.getByTestId(proposalDescriptionToggle).click();
|
||||||
|
cy.getByTestId('proposal-description-toggle');
|
||||||
|
cy.getByTestId(proposalDetailsDescription)
|
||||||
|
.find('p')
|
||||||
|
.should('have.text', proposalDescription);
|
||||||
});
|
});
|
||||||
cy.getByTestId(proposalDetailsDescription).within(() => {
|
|
||||||
cy.get('p').should('not.have.text', 'Hyperlink text');
|
|
||||||
cy.getByTestId('show-more-btn').click();
|
|
||||||
cy.get('p')
|
|
||||||
.invoke('text')
|
|
||||||
.should('have.have.length', 2194) // Full description is displayed
|
|
||||||
.and('contain', 'Hyperlink text');
|
|
||||||
cy.get('a').should('have.attr', 'href');
|
|
||||||
});
|
|
||||||
|
|
||||||
// 3001-VOTE-008
|
// 3001-VOTE-008
|
||||||
getProposalInformationFromTable('ID')
|
getProposalInformationFromTable('ID')
|
||||||
.invoke('text')
|
.invoke('text')
|
||||||
@@ -230,7 +215,6 @@ describe(
|
|||||||
cy.getByTestId(changeVoteButton).should('be.visible').click();
|
cy.getByTestId(changeVoteButton).should('be.visible').click();
|
||||||
voteForProposal('for');
|
voteForProposal('for');
|
||||||
// 3001-VOTE-064
|
// 3001-VOTE-064
|
||||||
cy.getByTestId('user-voted-yes').should('exist');
|
|
||||||
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');
|
||||||
@@ -370,97 +354,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(() => {
|
|
||||||
// Assert that all toggles are removed
|
|
||||||
cy.getByTestId('accordion-toggle').should('not.exist');
|
|
||||||
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'
|
|
||||||
);
|
|
||||||
|
|
||||||
validateProposalDetailsDiff(
|
|
||||||
'Market Name',
|
|
||||||
proposalChangeType.UPDATED,
|
|
||||||
'Token test market',
|
|
||||||
'Test market 1'
|
|
||||||
);
|
|
||||||
|
|
||||||
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.'
|
|
||||||
);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -42,7 +42,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();
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -29,7 +29,6 @@ const toastPanel = 'toast-panel';
|
|||||||
const toastClose = 'toast-close';
|
const toastClose = 'toast-close';
|
||||||
const withdrawalDialogContent = 'dialog-content';
|
const withdrawalDialogContent = 'dialog-content';
|
||||||
const toastCompleteWithdrawal = 'toast-complete-withdrawal';
|
const toastCompleteWithdrawal = 'toast-complete-withdrawal';
|
||||||
const scrollBar = '.ag-body-horizontal-scroll-viewport';
|
|
||||||
const usdtName = 'USDC (local)';
|
const usdtName = 'USDC (local)';
|
||||||
const usdcEthAddress = '0x1b8a1B6CBE5c93609b46D1829Cc7f3Cb8eeE23a0';
|
const usdcEthAddress = '0x1b8a1B6CBE5c93609b46D1829Cc7f3Cb8eeE23a0';
|
||||||
const usdcSymbol = 'tUSDC';
|
const usdcSymbol = 'tUSDC';
|
||||||
@@ -51,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);
|
||||||
@@ -98,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 () {
|
||||||
@@ -200,17 +197,20 @@ context(
|
|||||||
);
|
);
|
||||||
cy.getByTestId(toastClose).click();
|
cy.getByTestId(toastClose).click();
|
||||||
});
|
});
|
||||||
cy.get("[row-id='0']").within(() => {
|
cy.get(tableTxHash)
|
||||||
cy.get(tableAssetSymbol).should('have.text', usdcSymbol);
|
.eq(1)
|
||||||
cy.get(tableAmount).should('have.text', '110.00');
|
.should('have.text', 'Complete withdrawal')
|
||||||
cy.get(tableReceiverAddress)
|
.parent()
|
||||||
.find('a')
|
.within(() => {
|
||||||
.should('have.attr', 'href')
|
cy.get(tableAssetSymbol).should('have.text', usdcSymbol);
|
||||||
.and('contain', 'https://sepolia.etherscan.io/address/');
|
cy.get(tableAmount).should('have.text', '110.00');
|
||||||
cy.get(tableCreatedTimeStamp).should('not.be.empty');
|
cy.get(tableReceiverAddress)
|
||||||
});
|
.find('a')
|
||||||
|
.should('have.attr', 'href')
|
||||||
|
.and('contain', 'https://sepolia.etherscan.io/address/');
|
||||||
|
cy.get(tableCreatedTimeStamp).should('not.be.empty');
|
||||||
|
});
|
||||||
ethereumWalletConnect();
|
ethereumWalletConnect();
|
||||||
cy.get(scrollBar).scrollTo('right');
|
|
||||||
cy.getByTestId(completeWithdrawalButton).first().click();
|
cy.getByTestId(completeWithdrawalButton).first().click();
|
||||||
cy.getByTestId(toast)
|
cy.getByTestId(toast)
|
||||||
.last(txTimeout)
|
.last(txTimeout)
|
||||||
|
|||||||
@@ -119,7 +119,6 @@ context('Home Page - verify elements on page', { tags: '@smoke' }, function () {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
// 0006-NETW-001 0006-NETW-002
|
|
||||||
it('should display network data', function () {
|
it('should display network data', function () {
|
||||||
cy.getByTestId('git-network-data')
|
cy.getByTestId('git-network-data')
|
||||||
.should('contain.text', 'Reading network data from')
|
.should('contain.text', 'Reading network data from')
|
||||||
@@ -131,37 +130,6 @@ context('Home Page - verify elements on page', { tags: '@smoke' }, function () {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
// 0006-NETW-003 0006-NETW-008 0006-NETW-009 0006-NETW-010 0006-NETW-012 0006-NETW-013 0006-NETW-017 0006-NETW-018 0006-NETW-019 0006-NETW-020
|
|
||||||
it('should have option to switch to different network node', function () {
|
|
||||||
cy.getByTestId('git-network-data').within(() => {
|
|
||||||
cy.getByTestId('link').click();
|
|
||||||
});
|
|
||||||
cy.getByTestId('node-row').within(() => {
|
|
||||||
cy.getByTestId('node-url-0')
|
|
||||||
.parent()
|
|
||||||
.should('have.text', 'http://localhost:3008/graphql');
|
|
||||||
cy.getByTestId('response-time-cell')
|
|
||||||
.invoke('text')
|
|
||||||
.should('not.be.empty')
|
|
||||||
.and('not.eq', 'Checking');
|
|
||||||
cy.getByTestId('block-height-cell')
|
|
||||||
.invoke('text')
|
|
||||||
.should('not.be.empty')
|
|
||||||
.then((currentBlockHeight) => {
|
|
||||||
// Check that block height updates automatically
|
|
||||||
cy.getByTestId('block-height-cell')
|
|
||||||
.invoke('text')
|
|
||||||
.should('not.eq', currentBlockHeight);
|
|
||||||
});
|
|
||||||
cy.getByTestId('subscription-cell').should('have.text', 'Yes');
|
|
||||||
});
|
|
||||||
cy.getByTestId('connect').should('be.disabled');
|
|
||||||
cy.getByTestId('node-url-custom').click();
|
|
||||||
cy.get('input').should('exist');
|
|
||||||
cy.getByTestId('connect').should('be.disabled');
|
|
||||||
cy.getByTestId('icon-cross').click();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should display eth data', function () {
|
it('should display eth data', function () {
|
||||||
cy.getByTestId('git-eth-data')
|
cy.getByTestId('git-eth-data')
|
||||||
.should('contain.text', 'Reading Ethereum data from')
|
.should('contain.text', 'Reading Ethereum data from')
|
||||||
@@ -170,7 +138,6 @@ context('Home Page - verify elements on page', { tags: '@smoke' }, function () {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
// 0006-NETW-011
|
|
||||||
it('should contain link for known issues on Github', function () {
|
it('should contain link for known issues on Github', function () {
|
||||||
cy.getByTestId('git-info').within(() => {
|
cy.getByTestId('git-info').within(() => {
|
||||||
cy.contains('Known issues and feedback on')
|
cy.contains('Known issues and feedback on')
|
||||||
|
|||||||
@@ -231,7 +231,7 @@ context(
|
|||||||
});
|
});
|
||||||
|
|
||||||
// 3009-NTWU-001 3009-NTWU-002 3009-NTWU-006 3009-NTWU-009
|
// 3009-NTWU-001 3009-NTWU-002 3009-NTWU-006 3009-NTWU-009
|
||||||
it.skip('should display network upgrade banner with estimate', function () {
|
it('should display network upgrade banner with estimate', function () {
|
||||||
mockNetworkUpgradeProposal();
|
mockNetworkUpgradeProposal();
|
||||||
cy.visit('/');
|
cy.visit('/');
|
||||||
cy.getByTestId('banners').within(() => {
|
cy.getByTestId('banners').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-rest')
|
||||||
|
.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-rest').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,11 +252,3 @@ export enum governanceProposalType {
|
|||||||
FREEFORM = 'Freeform',
|
FREEFORM = 'Freeform',
|
||||||
RAW = 'raw proposal',
|
RAW = 'raw proposal',
|
||||||
}
|
}
|
||||||
|
|
||||||
export enum proposalChangeType {
|
|
||||||
UPDATED = 'Updated',
|
|
||||||
ADDED = 'Added',
|
|
||||||
}
|
|
||||||
|
|
||||||
export const longProposalDescription =
|
|
||||||
'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam bibendum orci augue, vel imperdiet augue ultrices sed. In hac habitasse platea dictumst. Sed eget elit vitae nisl tincidunt faucibus. Donec pellentesque mauris nec viverra blandit. Aenean eros diam, tempor eu luctus nec, rhoncus non massa. Mauris libero diam, mattis et enim ut, lobortis pharetra elit. Phasellus vel metus accumsan, rhoncus tellus finibus, blandit mi. In sollicitudin ex ac tortor ornare interdum. Sed est ipsum, vestibulum eget dolor vel, porta luctus elit. Fusce justo nibh, placerat eget sollicitudin eleifend, rhoncus id lorem. Fusce vitae magna vel urna faucibus accumsan quis id purus.\nPraesent convallis dolor sed ante ultricies tempor. Proin sed risus ut libero euismod semper. Duis quis quam sed lacus viverra blandit vel scelerisque diam. Donec interdum, ipsum eget imperdiet ornare, risus augue faucibus lectus, ullamcorper scelerisque erat sapien in purus. Nunc molestie tincidunt felis dignissim vestibulum. Quisque quis ornare enim, non dignissim lectus. Mauris mollis, massa ut maximus consectetur, sem mi lobortis quam, vel malesuada eros tortor nec ex. Cras ac nunc sed erat malesuada varius a quis nulla. Curabitur cursus nec sem sit amet aliquet. Ut tristique tortor neque, a dignissim lectus dictum vel. Praesent sollicitudin bibendum vulputate.\nAenean bibendum tristique diam laoreet posuere. Curabitur ornare lectus ut diam ultricies, ut sodales eros lacinia. Maecenas mauris turpis, gravida non arcu ac, interdum auctor sapien. Vestibulum sed tortor quam. Interdum et malesuada fames ac ante ipsum primis in faucibus. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec finibus pulvinar magna, non laoreet lectus molestie nec. Vestibulum tempus mattis vehicula. Praesent in orci lectus. In commodo sollicitudin lacus, et lobortis eros placerat vitae. Proin mi libero, feugiat id pretium posuere, rhoncus ut augue. Cras massa tortor, rutrum sed ex vitae, posuere pretium augue. Donec pellentesque suscipit dignissim. Vivamus convallis a odio vitae sodales. Nullam non eleifend mauris, sed iaculis lectus. Cras facilisis justo at ante.\n[Hyperlink text](https://dweb.link/ipfs/bafybeigwwctpv37xdcwacqxvekr6e4kaemqsrv34em6glkbiceo3fcy4si)';
|
|
||||||
|
|||||||
@@ -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,22 +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',
|
|
||||||
txTimeout
|
|
||||||
).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,7 +173,7 @@ export function clickOnValidatorFromList(
|
|||||||
} else {
|
} else {
|
||||||
cy.get(`[row-id="${validatorNumber}"]`)
|
cy.get(`[row-id="${validatorNumber}"]`)
|
||||||
.should('be.visible')
|
.should('be.visible')
|
||||||
.first()
|
.find(stakeValidatorListName)
|
||||||
.as('validatorOnList');
|
.as('validatorOnList');
|
||||||
cy.get('@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
|
||||||
@@ -22,13 +21,9 @@ NX_VEGA_REST_URL=https://api.n00.stagnet1.vega.xyz/api/v2/
|
|||||||
NX_TENDERMINT_URL=https://tm.n01.stagnet1.vega.rocks
|
NX_TENDERMINT_URL=https://tm.n01.stagnet1.vega.rocks
|
||||||
NX_TENDERMINT_WEBSOCKET_URL=wss://tm.n01.stagnet1.vega.xyz/websocket
|
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
|
# Cosmic elevator flags
|
||||||
NX_SUCCESSOR_MARKETS=true
|
NX_SUCCESSOR_MARKETS=true
|
||||||
NX_METAMASK_SNAPS=true
|
|
||||||
@@ -19,9 +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_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
|
|
||||||
|
|
||||||
NX_TENDERMINT_URL=http://localhost:26617
|
NX_TENDERMINT_URL=http://localhost:26617
|
||||||
NX_TENDERMINT_WEBSOCKET_URL=wss://localhost:26617/websocket
|
NX_TENDERMINT_WEBSOCKET_URL=wss://localhost:26617/websocket
|
||||||
|
|
||||||
@@ -29,5 +26,4 @@ NX_TENDERMINT_WEBSOCKET_URL=wss://localhost:26617/websocket
|
|||||||
CYPRESS_FAIRGROUND=false
|
CYPRESS_FAIRGROUND=false
|
||||||
|
|
||||||
# Cosmic elevator flags
|
# Cosmic elevator flags
|
||||||
NX_SUCCESSOR_MARKETS=false
|
NX_SUCCESSOR_MARKETS=false
|
||||||
NX_METAMASK_SNAPS=false
|
|
||||||
@@ -14,12 +14,8 @@ NX_ANNOUNCEMENTS_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/annou
|
|||||||
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_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
|
|
||||||
|
|
||||||
NX_TENDERMINT_URL=https://tm.be.devnet1.vega.xyz/
|
NX_TENDERMINT_URL=https://tm.be.devnet1.vega.xyz/
|
||||||
NX_TENDERMINT_WEBSOCKET_URL=wss://be.devnet1.vega.xyz/websocket
|
NX_TENDERMINT_WEBSOCKET_URL=wss://be.devnet1.vega.xyz/websocket
|
||||||
|
|
||||||
# Cosmic elevator flags
|
# Cosmic elevator flags
|
||||||
NX_SUCCESSOR_MARKETS=true
|
NX_SUCCESSOR_MARKETS=true
|
||||||
NX_METAMASK_SNAPS=true
|
|
||||||
@@ -14,12 +14,9 @@ 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_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
|
|
||||||
|
|
||||||
NX_TENDERMINT_URL=https://be.vega.community
|
NX_TENDERMINT_URL=https://be.vega.community
|
||||||
NX_TENDERMINT_WEBSOCKET_URL=wss://be.vega.community/websocket
|
NX_TENDERMINT_WEBSOCKET_URL=wss://be.vega.community/websocket
|
||||||
|
|
||||||
# Cosmic elevator flags
|
# Cosmic elevator flags
|
||||||
NX_SUCCESSOR_MARKETS=false
|
NX_SUCCESSOR_MARKETS=false
|
||||||
NX_METAMASK_SNAPS=false
|
|
||||||
@@ -13,12 +13,9 @@ 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_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
|
|
||||||
|
|
||||||
NX_TENDERMINT_URL=https://be.mainnet-mirror.vega.rocks
|
NX_TENDERMINT_URL=https://be.mainnet-mirror.vega.rocks
|
||||||
NX_TENDERMINT_WEBSOCKET_URL=wss://be.mainnet-mirror.vega.rocks/websocket
|
NX_TENDERMINT_WEBSOCKET_URL=wss://be.mainnet-mirror.vega.rocks/websocket
|
||||||
|
|
||||||
# Cosmic elevator flags
|
# Cosmic elevator flags
|
||||||
NX_SUCCESSOR_MARKETS=false
|
NX_SUCCESSOR_MARKETS=false
|
||||||
NX_METAMASK_SNAPS=false
|
|
||||||
@@ -10,12 +10,8 @@ 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_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
|
|
||||||
|
|
||||||
NX_TENDERMINT_URL=https://tm.n01.stagnet1.vega.rocks
|
NX_TENDERMINT_URL=https://tm.n01.stagnet1.vega.rocks
|
||||||
NX_TENDERMINT_WEBSOCKET_URL=wss://tm.n01.stagnet1.vega.xyz/websocket
|
NX_TENDERMINT_WEBSOCKET_URL=wss://tm.n01.stagnet1.vega.xyz/websocket
|
||||||
|
|
||||||
# Cosmic elevator flags
|
# Cosmic elevator flags
|
||||||
NX_SUCCESSOR_MARKETS=true
|
NX_SUCCESSOR_MARKETS=true
|
||||||
NX_METAMASK_SNAPS=true
|
|
||||||
@@ -15,12 +15,8 @@ NX_ANNOUNCEMENTS_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/annou
|
|||||||
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_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
|
|
||||||
|
|
||||||
NX_TENDERMINT_URL=https://tm.be.testnet.vega.xyz
|
NX_TENDERMINT_URL=https://tm.be.testnet.vega.xyz
|
||||||
NX_TENDERMINT_WEBSOCKET_URL=wss://be.testnet.vega.xyz/websocket
|
NX_TENDERMINT_WEBSOCKET_URL=wss://be.testnet.vega.xyz/websocket
|
||||||
|
|
||||||
# Cosmic elevator flags
|
# Cosmic elevator flags
|
||||||
NX_SUCCESSOR_MARKETS=true
|
NX_SUCCESSOR_MARKETS=true
|
||||||
NX_METAMASK_SNAPS=true
|
|
||||||
@@ -12,12 +12,8 @@ NX_ANNOUNCEMENTS_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/annou
|
|||||||
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_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
|
|
||||||
|
|
||||||
NX_TENDERMINT_URL=https://tm.be.validators-testnet.vega.rocks
|
NX_TENDERMINT_URL=https://tm.be.validators-testnet.vega.rocks
|
||||||
NX_TENDERMINT_WEBSOCKET_URL=wss://be.validators-testnet.vega.
|
NX_TENDERMINT_WEBSOCKET_URL=wss://be.validators-testnet.vega.
|
||||||
|
|
||||||
# Cosmic elevator flags
|
# Cosmic elevator flags
|
||||||
NX_SUCCESSOR_MARKETS=false
|
NX_SUCCESSOR_MARKETS=false
|
||||||
NX_METAMASK_SNAPS=false
|
|
||||||
@@ -41,7 +41,6 @@ import {
|
|||||||
AppFailure,
|
AppFailure,
|
||||||
NodeSwitcherDialog,
|
NodeSwitcherDialog,
|
||||||
useNodeSwitcherStore,
|
useNodeSwitcherStore,
|
||||||
DocsLinks,
|
|
||||||
} from '@vegaprotocol/environment';
|
} from '@vegaprotocol/environment';
|
||||||
import { ENV } from './config';
|
import { ENV } from './config';
|
||||||
import type { InMemoryCacheConfig } from '@apollo/client';
|
import type { InMemoryCacheConfig } from '@apollo/client';
|
||||||
@@ -110,17 +109,8 @@ const Web3Container = ({
|
|||||||
store.connectors,
|
store.connectors,
|
||||||
store.initialize,
|
store.initialize,
|
||||||
]);
|
]);
|
||||||
const {
|
const { ETHEREUM_PROVIDER_URL, ETH_LOCAL_PROVIDER_URL, ETH_WALLET_MNEMONIC } =
|
||||||
ETHEREUM_PROVIDER_URL,
|
useEnvironment();
|
||||||
ETH_LOCAL_PROVIDER_URL,
|
|
||||||
ETH_WALLET_MNEMONIC,
|
|
||||||
VEGA_ENV,
|
|
||||||
VEGA_URL,
|
|
||||||
VEGA_EXPLORER_URL,
|
|
||||||
CHROME_EXTENSION_URL,
|
|
||||||
MOZILLA_EXTENSION_URL,
|
|
||||||
VEGA_WALLET_URL,
|
|
||||||
} = useEnvironment();
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (chainId) {
|
if (chainId) {
|
||||||
return initializeConnectors(
|
return initializeConnectors(
|
||||||
@@ -149,33 +139,10 @@ const Web3Container = ({
|
|||||||
return <SplashLoader />;
|
return <SplashLoader />;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (
|
|
||||||
!VEGA_URL ||
|
|
||||||
!VEGA_WALLET_URL ||
|
|
||||||
!VEGA_EXPLORER_URL ||
|
|
||||||
!DocsLinks ||
|
|
||||||
!CHROME_EXTENSION_URL ||
|
|
||||||
!MOZILLA_EXTENSION_URL
|
|
||||||
) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Web3Provider connectors={connectors}>
|
<Web3Provider connectors={connectors}>
|
||||||
<Web3Connector connectors={connectors} chainId={Number(chainId)}>
|
<Web3Connector connectors={connectors} chainId={Number(chainId)}>
|
||||||
<VegaWalletProvider
|
<VegaWalletProvider>
|
||||||
config={{
|
|
||||||
network: VEGA_ENV,
|
|
||||||
vegaUrl: VEGA_URL,
|
|
||||||
vegaWalletServiceUrl: VEGA_WALLET_URL,
|
|
||||||
links: {
|
|
||||||
explorer: VEGA_EXPLORER_URL,
|
|
||||||
concepts: DocsLinks?.VEGA_WALLET_CONCEPTS_URL,
|
|
||||||
chromeExtensionUrl: CHROME_EXTENSION_URL,
|
|
||||||
mozillaExtensionUrl: MOZILLA_EXTENSION_URL,
|
|
||||||
},
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<ContractsProvider>
|
<ContractsProvider>
|
||||||
<AppLoader>
|
<AppLoader>
|
||||||
<BalanceManager>
|
<BalanceManager>
|
||||||
@@ -308,7 +275,7 @@ const AppContainer = () => {
|
|||||||
<Router>
|
<Router>
|
||||||
<ScrollToTop />
|
<ScrollToTop />
|
||||||
<AppStateProvider>
|
<AppStateProvider>
|
||||||
<div className="min-h-full text-white grid">
|
<div className="grid min-h-full text-white">
|
||||||
<NodeGuard
|
<NodeGuard
|
||||||
skeleton={<div>{t('Loading')}</div>}
|
skeleton={<div>{t('Loading')}</div>}
|
||||||
failure={
|
failure={
|
||||||
|
|||||||
@@ -6,7 +6,6 @@ import { Nav } from '../nav';
|
|||||||
import { Networks, useEnvironment } from '@vegaprotocol/environment';
|
import { Networks, useEnvironment } from '@vegaprotocol/environment';
|
||||||
import {
|
import {
|
||||||
ProtocolUpgradeCountdownMode,
|
ProtocolUpgradeCountdownMode,
|
||||||
ProtocolUpgradeInProgressNotification,
|
|
||||||
ProtocolUpgradeProposalNotification,
|
ProtocolUpgradeProposalNotification,
|
||||||
} from '@vegaprotocol/proposals';
|
} from '@vegaprotocol/proposals';
|
||||||
import { ViewingAsBanner } from '@vegaprotocol/ui-toolkit';
|
import { ViewingAsBanner } from '@vegaprotocol/ui-toolkit';
|
||||||
@@ -50,7 +49,6 @@ const NotificationsContainer = () => {
|
|||||||
<ProtocolUpgradeProposalNotification
|
<ProtocolUpgradeProposalNotification
|
||||||
mode={ProtocolUpgradeCountdownMode.IN_ESTIMATED_TIME_REMAINING}
|
mode={ProtocolUpgradeCountdownMode.IN_ESTIMATED_TIME_REMAINING}
|
||||||
/>
|
/>
|
||||||
<ProtocolUpgradeInProgressNotification />
|
|
||||||
{isReadOnly ? (
|
{isReadOnly ? (
|
||||||
<ViewingAsBanner pubKey={pubKey} disconnect={disconnect} />
|
<ViewingAsBanner pubKey={pubKey} disconnect={disconnect} />
|
||||||
) : null}
|
) : null}
|
||||||
|
|||||||
@@ -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';
|
||||||
@@ -85,7 +85,7 @@ const VegaWalletNotConnected = () => {
|
|||||||
>
|
>
|
||||||
{t('connectVegaWalletToUseAssociated')}
|
{t('connectVegaWalletToUseAssociated')}
|
||||||
</Button>
|
</Button>
|
||||||
<VegaWalletPrompt />
|
<DownloadWalletPrompt />
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -626,8 +626,7 @@
|
|||||||
"status-tendermint": "Consensus",
|
"status-tendermint": "Consensus",
|
||||||
"status-ersatz": "Standby",
|
"status-ersatz": "Standby",
|
||||||
"status-pending": "Candidate",
|
"status-pending": "Candidate",
|
||||||
"ersatzDescription1": "To be promoted, a standby validator must have more than the lowest consensus stake, plus a bonus given to existing validators, and only one standby validator can be promoted per epoch. Currently this requires a minimum of",
|
"ersatzDescription": "To be promoted, a standby validator must have more than the lowest consensus stake, plus a bonus given to existing validators. This currently requires a minimum of {{stakeNeededForPromotion}} stake assuming no penalties. Only one validator per epoch can be promoted.",
|
||||||
"ersatzDescription2": "stake assuming no performance penalty incurred.",
|
|
||||||
"pendingDescription1": "Anyone can",
|
"pendingDescription1": "Anyone can",
|
||||||
"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.",
|
||||||
@@ -785,7 +784,6 @@
|
|||||||
"PerformancePenaltyDescription": "Performance score is a measure of how often a validator proposed blocks in the last epoch relative to how many they should be expected to propose based on their voting power. Performance penalty is applied for having a performance score of less than 1",
|
"PerformancePenaltyDescription": "Performance score is a measure of how often a validator proposed blocks in the last epoch relative to how many they should be expected to propose based on their voting power. Performance penalty is applied for having a performance score of less than 1",
|
||||||
"UnnormalisedVotingPowerDescription": "The voting power of the validator based on their final validator score after all penalties have been applied",
|
"UnnormalisedVotingPowerDescription": "The voting power of the validator based on their final validator score after all penalties have been applied",
|
||||||
"NormalisedVotingPowerDescription": "The voting power of the validator, adjusted to ensure all validator scores sum to 1, used for distribution of rewards",
|
"NormalisedVotingPowerDescription": "The voting power of the validator, adjusted to ensure all validator scores sum to 1, used for distribution of rewards",
|
||||||
"NonConsensusVotingPowerDescription": "The voting power of the validator. Only consensus validators have voting power",
|
|
||||||
"Score": "Score",
|
"Score": "Score",
|
||||||
"performancePenalty": "Performance penalty",
|
"performancePenalty": "Performance penalty",
|
||||||
"overstaked": "Overstaked",
|
"overstaked": "Overstaked",
|
||||||
@@ -857,6 +855,5 @@
|
|||||||
"Estimated time to upgrade": "Estimated time to upgrade",
|
"Estimated time to upgrade": "Estimated time to upgrade",
|
||||||
"Upgraded at": "Upgraded at",
|
"Upgraded at": "Upgraded at",
|
||||||
"dataIsIdentical": "Data is identical",
|
"dataIsIdentical": "Data is identical",
|
||||||
"updatesToMarket": "Updates to market",
|
"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>
|
||||||
|
|||||||
@@ -1,25 +1,20 @@
|
|||||||
import { FLAGS } from '@vegaprotocol/environment';
|
|
||||||
import {
|
import {
|
||||||
|
RestConnector,
|
||||||
JsonRpcConnector,
|
JsonRpcConnector,
|
||||||
ViewConnector,
|
ViewConnector,
|
||||||
InjectedConnector,
|
InjectedConnector,
|
||||||
SnapConnector,
|
|
||||||
DEFAULT_SNAP_ID,
|
|
||||||
} from '@vegaprotocol/wallet';
|
} from '@vegaprotocol/wallet';
|
||||||
|
|
||||||
const urlParams = new URLSearchParams(window.location.search);
|
const urlParams = new URLSearchParams(window.location.search);
|
||||||
|
|
||||||
export const jsonRpc = new JsonRpcConnector();
|
|
||||||
export const injected = new InjectedConnector();
|
export const injected = new InjectedConnector();
|
||||||
|
export const rest = new RestConnector();
|
||||||
|
export const jsonRpc = new JsonRpcConnector();
|
||||||
export const view = new ViewConnector(urlParams.get('address'));
|
export const view = new ViewConnector(urlParams.get('address'));
|
||||||
|
|
||||||
export const snap = FLAGS.METAMASK_SNAPS
|
|
||||||
? new SnapConnector(DEFAULT_SNAP_ID)
|
|
||||||
: undefined;
|
|
||||||
|
|
||||||
export const Connectors = {
|
export const Connectors = {
|
||||||
injected,
|
injected,
|
||||||
|
rest,
|
||||||
jsonRpc,
|
jsonRpc,
|
||||||
view,
|
view,
|
||||||
snap,
|
|
||||||
};
|
};
|
||||||
|
|||||||
+38
-21
@@ -1,27 +1,44 @@
|
|||||||
import ReactMarkdown from 'react-markdown';
|
import ReactMarkdown from 'react-markdown';
|
||||||
import { RoundedWrapper, ShowMore } from '@vegaprotocol/ui-toolkit';
|
import { useState } from 'react';
|
||||||
|
import { useTranslation } from 'react-i18next';
|
||||||
|
import { RoundedWrapper } from '@vegaprotocol/ui-toolkit';
|
||||||
|
import { SubHeading } from '../../../../components/heading';
|
||||||
|
import { CollapsibleToggle } from '../../../../components/collapsible-toggle';
|
||||||
|
|
||||||
export const ProposalDescription = ({
|
export const ProposalDescription = ({
|
||||||
description,
|
description,
|
||||||
}: {
|
}: {
|
||||||
description: string;
|
description: string;
|
||||||
}) => (
|
}) => {
|
||||||
<section data-testid="proposal-description">
|
const { t } = useTranslation();
|
||||||
<RoundedWrapper paddingBottom={true} marginBottomLarge={true}>
|
const [showDescription, setShowDescription] = useState(false);
|
||||||
<div className="p-2">
|
|
||||||
<ShowMore>
|
return (
|
||||||
<ReactMarkdown
|
<section data-testid="proposal-description">
|
||||||
className="react-markdown-container"
|
<CollapsibleToggle
|
||||||
/* Prevents HTML embedded in the description from rendering */
|
toggleState={showDescription}
|
||||||
skipHtml={true}
|
setToggleState={setShowDescription}
|
||||||
/* Stops users embedding images which could be used for tracking */
|
dataTestId={'proposal-description-toggle'}
|
||||||
disallowedElements={['img']}
|
>
|
||||||
linkTarget="_blank"
|
<SubHeading title={t('proposalDescription')} />
|
||||||
>
|
</CollapsibleToggle>
|
||||||
{description}
|
|
||||||
</ReactMarkdown>
|
{showDescription && (
|
||||||
</ShowMore>
|
<RoundedWrapper paddingBottom={true} marginBottomLarge={true}>
|
||||||
</div>
|
<div className="p-2">
|
||||||
</RoundedWrapper>
|
<ReactMarkdown
|
||||||
</section>
|
className="react-markdown-container"
|
||||||
);
|
/* Prevents HTML embedded in the description from rendering */
|
||||||
|
skipHtml={true}
|
||||||
|
/* Stops users embedding images which could be used for tracking */
|
||||||
|
disallowedElements={['img']}
|
||||||
|
linkTarget="_blank"
|
||||||
|
>
|
||||||
|
{description}
|
||||||
|
</ReactMarkdown>
|
||||||
|
</div>
|
||||||
|
</RoundedWrapper>
|
||||||
|
)}
|
||||||
|
</section>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|||||||
+9
-22
@@ -24,7 +24,6 @@ import type { ProposalQuery } from '../../proposal/__generated__/Proposal';
|
|||||||
import type { MockedResponse } from '@apollo/client/testing';
|
import type { MockedResponse } from '@apollo/client/testing';
|
||||||
import { FLAGS } from '@vegaprotocol/environment';
|
import { FLAGS } from '@vegaprotocol/environment';
|
||||||
import { BrowserRouter } from 'react-router-dom';
|
import { BrowserRouter } from 'react-router-dom';
|
||||||
import { VoteState } from '../vote-details/use-user-vote';
|
|
||||||
|
|
||||||
jest.mock('@vegaprotocol/proposals', () => ({
|
jest.mock('@vegaprotocol/proposals', () => ({
|
||||||
...jest.requireActual('@vegaprotocol/proposals'),
|
...jest.requireActual('@vegaprotocol/proposals'),
|
||||||
@@ -37,8 +36,7 @@ jest.mock('@vegaprotocol/proposals', () => ({
|
|||||||
const renderComponent = (
|
const renderComponent = (
|
||||||
proposal: ProposalQuery['proposal'],
|
proposal: ProposalQuery['proposal'],
|
||||||
isListItem = true,
|
isListItem = true,
|
||||||
mocks: MockedResponse[] = [],
|
mocks: MockedResponse[] = []
|
||||||
voteState?: VoteState
|
|
||||||
) =>
|
) =>
|
||||||
render(
|
render(
|
||||||
<AppStateProvider>
|
<AppStateProvider>
|
||||||
@@ -49,7 +47,6 @@ const renderComponent = (
|
|||||||
proposal={proposal}
|
proposal={proposal}
|
||||||
isListItem={isListItem}
|
isListItem={isListItem}
|
||||||
networkParams={mockNetworkParams}
|
networkParams={mockNetworkParams}
|
||||||
voteState={voteState}
|
|
||||||
/>
|
/>
|
||||||
</VegaWalletContext.Provider>
|
</VegaWalletContext.Provider>
|
||||||
</MockedProvider>
|
</MockedProvider>
|
||||||
@@ -389,15 +386,10 @@ describe('Proposal header', () => {
|
|||||||
closingDatetime: nextWeek.toString(),
|
closingDatetime: nextWeek.toString(),
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
renderComponent(
|
renderComponent(proposal, true, [
|
||||||
proposal,
|
// @ts-ignore generateProposal always creates an id
|
||||||
true,
|
createUserVoteQueryMock(proposal.id, VoteValue.VALUE_NO),
|
||||||
[
|
]);
|
||||||
// @ts-ignore generateProposal always creates an id
|
|
||||||
createUserVoteQueryMock(proposal.id, VoteValue.VALUE_NO),
|
|
||||||
],
|
|
||||||
VoteState.No
|
|
||||||
);
|
|
||||||
expect(await screen.findByTestId('user-voted-no')).toBeInTheDocument();
|
expect(await screen.findByTestId('user-voted-no')).toBeInTheDocument();
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -408,15 +400,10 @@ describe('Proposal header', () => {
|
|||||||
closingDatetime: nextWeek.toString(),
|
closingDatetime: nextWeek.toString(),
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
renderComponent(
|
renderComponent(proposal, true, [
|
||||||
proposal,
|
// @ts-ignore generateProposal always creates an id
|
||||||
true,
|
createUserVoteQueryMock(proposal.id, VoteValue.VALUE_YES),
|
||||||
[
|
]);
|
||||||
// @ts-ignore generateProposal always creates an id
|
|
||||||
createUserVoteQueryMock(proposal.id, VoteValue.VALUE_YES),
|
|
||||||
],
|
|
||||||
VoteState.Yes
|
|
||||||
);
|
|
||||||
expect(await screen.findByTestId('user-voted-yes')).toBeInTheDocument();
|
expect(await screen.findByTestId('user-voted-yes')).toBeInTheDocument();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
+2
-3
@@ -8,26 +8,25 @@ import type { ProposalQuery } from '../../proposal/__generated__/Proposal';
|
|||||||
import { truncateMiddle } from '../../../../lib/truncate-middle';
|
import { truncateMiddle } from '../../../../lib/truncate-middle';
|
||||||
import { CurrentProposalState } from '../current-proposal-state';
|
import { CurrentProposalState } from '../current-proposal-state';
|
||||||
import { ProposalInfoLabel } from '../proposal-info-label';
|
import { ProposalInfoLabel } from '../proposal-info-label';
|
||||||
|
import { useUserVote } from '../vote-details/use-user-vote';
|
||||||
import { ProposalVotingStatus } from '../proposal-voting-status';
|
import { ProposalVotingStatus } from '../proposal-voting-status';
|
||||||
import type { NetworkParamsResult } from '@vegaprotocol/network-parameters';
|
import type { NetworkParamsResult } from '@vegaprotocol/network-parameters';
|
||||||
import { useSuccessorMarketProposalDetails } from '@vegaprotocol/proposals';
|
import { useSuccessorMarketProposalDetails } from '@vegaprotocol/proposals';
|
||||||
import { FLAGS } from '@vegaprotocol/environment';
|
import { FLAGS } from '@vegaprotocol/environment';
|
||||||
import Routes from '../../../routes';
|
import Routes from '../../../routes';
|
||||||
import { Link } from 'react-router-dom';
|
import { Link } from 'react-router-dom';
|
||||||
import type { VoteState } from '../vote-details/use-user-vote';
|
|
||||||
|
|
||||||
export const ProposalHeader = ({
|
export const ProposalHeader = ({
|
||||||
proposal,
|
proposal,
|
||||||
networkParams,
|
networkParams,
|
||||||
isListItem = true,
|
isListItem = true,
|
||||||
voteState,
|
|
||||||
}: {
|
}: {
|
||||||
proposal: ProposalFieldsFragment | ProposalQuery['proposal'];
|
proposal: ProposalFieldsFragment | ProposalQuery['proposal'];
|
||||||
networkParams: Partial<NetworkParamsResult>;
|
networkParams: Partial<NetworkParamsResult>;
|
||||||
isListItem?: boolean;
|
isListItem?: boolean;
|
||||||
voteState?: VoteState | null;
|
|
||||||
}) => {
|
}) => {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
|
const { voteState } = useUserVote(proposal?.id);
|
||||||
const change = proposal?.terms.change;
|
const change = proposal?.terms.change;
|
||||||
|
|
||||||
let details: ReactNode;
|
let details: ReactNode;
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user