diff --git a/.github/workflows/console-test-run.yml b/.github/workflows/console-test-run.yml index 84a27447c..20d8294ed 100644 --- a/.github/workflows/console-test-run.yml +++ b/.github/workflows/console-test-run.yml @@ -9,20 +9,28 @@ on: github-sha: required: true type: string + workflow_dispatch: + inputs: + console-test-branch: + type: choice + description: 'main: v0.72.14, develop: v0.73.0-preview7' + options: + - main + - develop jobs: run-tests: name: run-tests - runs-on: console-test - timeout-minutes: 40 + runs-on: 8-cores + timeout-minutes: 20 steps: #---------------------------------------------- # check-out frontend-monorepo #---------------------------------------------- - - name: Checkout console test repo + - name: Checkout frontend-monorepo uses: actions/checkout@v3 with: - ref: ${{ inputs.github-sha }} + ref: ${{ inputs.github-sha || github.sha }} #---------------------------------------------- # cache node modules #---------------------------------------------- @@ -68,7 +76,18 @@ jobs: uses: actions/checkout@v3 with: repository: vegaprotocol/console-test + ref: ${{ inputs.console-test-branch }} path: './console-test' + + - name: Load console test envs + id: console-test-env + uses: falti/dotenv-action@v1.0.4 + with: + path: './console-test/.env.${{ inputs.console-test-branch }}' + export-variables: true + keys-case: upper + log-variables: true + #---------------------------------------------- # install dependencies #---------------------------------------------- @@ -96,8 +115,7 @@ jobs: #---------------------------------------------- - name: Install vega binaries working-directory: ./console-test - if: steps.vega_binaries_cache.outputs.cache-hit != 'true' - run: poetry run python -m vega_sim.tools.load_binaries --force --version $VEGA_VERSION + run: poetry run python -m vega_sim.tools.load_binaries --force --version ${{ env.VEGA_VERSION }} #---------------------------------------------- # install playwright #---------------------------------------------- @@ -109,7 +127,7 @@ jobs: #---------------------------------------------- - name: Run tests working-directory: ./console-test - run: poetry run pytest -v -s --numprocesses 2 --dist loadfile --durations=20 + run: poetry run pytest -v -s --numprocesses 4 --dist loadfile --durations=15 - name: Check files run: | ls -al . @@ -124,3 +142,13 @@ jobs: name: playwright-trace path: ./traces/ retention-days: 15 + #---------------------------------------------- + # ----- upload logs ----- + #---------------------------------------------- + - name: Upload worker logs + uses: actions/upload-artifact@v3 + if: always() + with: + name: worker-logs + path: ./logs/ + retention-days: 15 diff --git a/apps/explorer-e2e/src/integration/market.cy.js b/apps/explorer-e2e/src/integration/market.cy.js index 559df3faa..085e84fe6 100644 --- a/apps/explorer-e2e/src/integration/market.cy.js +++ b/apps/explorer-e2e/src/integration/market.cy.js @@ -95,7 +95,6 @@ context('Market page', { tags: '@regression' }, function () { ); cy.validate_element_from_table('Lowest Price', '0.00 fUSDC'); cy.validate_element_from_table('Highest Price', '0.00 fUSDC'); - cy.getByTestId('oracle-spec-links') .should('have.attr', 'href') .and( diff --git a/apps/explorer/src/app/components/assets/assets-table.tsx b/apps/explorer/src/app/components/assets/assets-table.tsx index fb245be95..af3959d7a 100644 --- a/apps/explorer/src/app/components/assets/assets-table.tsx +++ b/apps/explorer/src/app/components/assets/assets-table.tsx @@ -4,7 +4,7 @@ import { AssetTypeMapping, AssetStatusMapping } from '@vegaprotocol/assets'; import { t } from '@vegaprotocol/i18n'; import { ButtonLink } from '@vegaprotocol/ui-toolkit'; import type { AgGridReact } from 'ag-grid-react'; -import { AgGridLazy as AgGrid } from '@vegaprotocol/datagrid'; +import { AgGrid } from '@vegaprotocol/datagrid'; import type { VegaICellRendererParams } from '@vegaprotocol/datagrid'; import { useRef, useLayoutEffect } from 'react'; import { BREAKPOINT_MD } from '../../config/breakpoints'; diff --git a/apps/explorer/src/app/components/markets/market-details.tsx b/apps/explorer/src/app/components/markets/market-details.tsx index 34de36f0d..9710057b4 100644 --- a/apps/explorer/src/app/components/markets/market-details.tsx +++ b/apps/explorer/src/app/components/markets/market-details.tsx @@ -1,6 +1,8 @@ import { t } from '@vegaprotocol/i18n'; import type { MarketInfoWithData } from '@vegaprotocol/markets'; import { + LiquidityPriceRangeInfoPanel, + LiquiditySLAParametersInfoPanel, PriceMonitoringBoundsInfoPanel, SuccessionLineInfoPanel, getDataSourceSpecForSettlementData, @@ -94,6 +96,10 @@ export const MarketDetails = ({ market }: { market: MarketInfoWithData }) => { )}

{t('Liquidity monitoring')}

+

{t('Liquidity price range')}

+ +

{t('Liquidity SLA protocol')}

+

{t('Liquidity')}

{showTwoOracles ? ( diff --git a/apps/explorer/src/app/components/markets/markets-table.tsx b/apps/explorer/src/app/components/markets/markets-table.tsx index e6a88089b..fd02c4d59 100644 --- a/apps/explorer/src/app/components/markets/markets-table.tsx +++ b/apps/explorer/src/app/components/markets/markets-table.tsx @@ -4,7 +4,7 @@ import { t } from '@vegaprotocol/i18n'; import { ButtonLink } from '@vegaprotocol/ui-toolkit'; import type { AgGridReact } from 'ag-grid-react'; import type { ColDef } from 'ag-grid-community'; -import { AgGridLazy as AgGrid } from '@vegaprotocol/datagrid'; +import { AgGrid } from '@vegaprotocol/datagrid'; import type { VegaICellRendererParams, VegaValueGetterParams, diff --git a/apps/explorer/src/app/components/proposals/proposals-table.tsx b/apps/explorer/src/app/components/proposals/proposals-table.tsx index 2986def3d..2bfb32992 100644 --- a/apps/explorer/src/app/components/proposals/proposals-table.tsx +++ b/apps/explorer/src/app/components/proposals/proposals-table.tsx @@ -2,7 +2,7 @@ import type { ProposalListFieldsFragment } from '@vegaprotocol/proposals'; import { VoteProgress } from '@vegaprotocol/proposals'; import type { AgGridReact } from 'ag-grid-react'; import { ExternalLink } from '@vegaprotocol/ui-toolkit'; -import { AgGridLazy as AgGrid } from '@vegaprotocol/datagrid'; +import { AgGrid } from '@vegaprotocol/datagrid'; import type { VegaICellRendererParams, VegaValueFormatterParams, @@ -105,7 +105,7 @@ export const ProposalsTable = ({ data }: ProposalsTableProps) => { ? new BigNumber(0) : yesTokens.multipliedBy(100).dividedBy(totalTokensVoted); return ( -
+
{ const { t } = useTranslation(); @@ -60,9 +60,12 @@ const HomeProposals = ({ ))} - {proposals.map((proposal) => ( - - ))} + {proposals.map( + (proposal) => + proposal?.id && ( + + ) + )}
@@ -182,6 +185,9 @@ const GovernanceHome = ({ name }: RouteChildProps) => { pollInterval: 5000, fetchPolicy: 'network-only', errorPolicy: 'ignore', + variables: { + includeNewMarketProductFields: !!FLAGS.PRODUCT_PERPETUALS, + }, }); const { @@ -206,7 +212,9 @@ const GovernanceHome = ({ name }: RouteChildProps) => { const proposals = useMemo( () => proposalsData - ? getNotRejectedProposals(proposalsData.proposalsConnection) + ? getNotRejectedProposals( + removePaginationWrapper(proposalsData.proposalsConnection?.edges) + ) : [], [proposalsData] ); diff --git a/apps/governance/src/routes/proposals/components/proposal-detail-header/proposal-header.tsx b/apps/governance/src/routes/proposals/components/proposal-detail-header/proposal-header.tsx index a1d59cbe9..017dcce5c 100644 --- a/apps/governance/src/routes/proposals/components/proposal-detail-header/proposal-header.tsx +++ b/apps/governance/src/routes/proposals/components/proposal-detail-header/proposal-header.tsx @@ -3,7 +3,6 @@ import { Lozenge, VegaIcon, VegaIconNames } from '@vegaprotocol/ui-toolkit'; import { shorten } from '@vegaprotocol/utils'; import { Heading, SubHeading } from '../../../../components/heading'; import type { ReactNode } from 'react'; -import type { ProposalFieldsFragment } from '../../proposals/__generated__/Proposals'; import type { ProposalQuery } from '../../proposal/__generated__/Proposal'; import { truncateMiddle } from '../../../../lib/truncate-middle'; import { CurrentProposalState } from '../current-proposal-state'; @@ -20,7 +19,7 @@ export const ProposalHeader = ({ isListItem = true, voteState, }: { - proposal: ProposalFieldsFragment | ProposalQuery['proposal']; + proposal: ProposalQuery['proposal']; isListItem?: boolean; voteState?: VoteState | null; }) => { @@ -37,7 +36,10 @@ export const ProposalHeader = ({ switch (change?.__typename) { case 'NewMarket': { - proposalType = 'NewMarket'; + proposalType = + FLAGS.PRODUCT_PERPETUALS && change?.instrument?.product?.__typename + ? `NewMarket${change?.instrument?.product?.__typename}` + : 'NewMarket'; fallbackTitle = t('NewMarketProposal'); details = ( <> diff --git a/apps/governance/src/routes/proposals/components/proposal-market-data/proposal-market-data.tsx b/apps/governance/src/routes/proposals/components/proposal-market-data/proposal-market-data.tsx index e9420b1a1..2b0aaebc0 100644 --- a/apps/governance/src/routes/proposals/components/proposal-market-data/proposal-market-data.tsx +++ b/apps/governance/src/routes/proposals/components/proposal-market-data/proposal-market-data.tsx @@ -5,6 +5,8 @@ import { InstrumentInfoPanel, KeyDetailsInfoPanel, LiquidityMonitoringParametersInfoPanel, + LiquidityPriceRangeInfoPanel, + LiquiditySLAParametersInfoPanel, MetadataInfoPanel, OracleInfoPanel, PriceMonitoringBoundsInfoPanel, @@ -270,6 +272,21 @@ export const ProposalMarketData = ({ market={marketData} parentMarket={parentMarketData} /> +

+ {t('Liquidity price range')} +

+ + +

+ {t('Liquidity SLA protocol')} +

+
)} diff --git a/apps/governance/src/routes/proposals/components/proposal/proposal.tsx b/apps/governance/src/routes/proposals/components/proposal/proposal.tsx index 327d84cfe..9bf1800e7 100644 --- a/apps/governance/src/routes/proposals/components/proposal/proposal.tsx +++ b/apps/governance/src/routes/proposals/components/proposal/proposal.tsx @@ -10,7 +10,6 @@ import { UserVote } from '../vote-details'; import { ListAsset } from '../list-asset'; import Routes from '../../../routes'; import { ProposalMarketData } from '../proposal-market-data'; -import type { ProposalFieldsFragment } from '../../proposals/__generated__/Proposals'; import type { ProposalQuery } from '../../proposal/__generated__/Proposal'; import type { MarketInfo } from '@vegaprotocol/markets'; import type { AssetQuery } from '@vegaprotocol/assets'; @@ -22,7 +21,7 @@ import { useVoteSubmit } from '@vegaprotocol/proposals'; import { useUserVote } from '../vote-details/use-user-vote'; export interface ProposalProps { - proposal: ProposalFieldsFragment | ProposalQuery['proposal']; + proposal: ProposalQuery['proposal']; networkParams: Partial; newMarketData?: MarketInfo | null; parentMarketData?: MarketInfo | null; diff --git a/apps/governance/src/routes/proposals/components/proposals-list-item/proposals-list-item.tsx b/apps/governance/src/routes/proposals/components/proposals-list-item/proposals-list-item.tsx index 815aa3f3f..09747d2b6 100644 --- a/apps/governance/src/routes/proposals/components/proposals-list-item/proposals-list-item.tsx +++ b/apps/governance/src/routes/proposals/components/proposals-list-item/proposals-list-item.tsx @@ -2,11 +2,10 @@ import { RoundedWrapper } from '@vegaprotocol/ui-toolkit'; import { ProposalHeader } from '../proposal-detail-header/proposal-header'; import { ProposalsListItemDetails } from './proposals-list-item-details'; import { useUserVote } from '../vote-details/use-user-vote'; -import type { ProposalFieldsFragment } from '../../proposals/__generated__/Proposals'; import type { ProposalQuery } from '../../proposal/__generated__/Proposal'; interface ProposalsListItemProps { - proposal?: ProposalFieldsFragment | ProposalQuery['proposal'] | null; + proposal?: ProposalQuery['proposal'] | null; } export const ProposalsListItem = ({ proposal }: ProposalsListItemProps) => { diff --git a/apps/governance/src/routes/proposals/components/proposals-list/proposals-list.tsx b/apps/governance/src/routes/proposals/components/proposals-list/proposals-list.tsx index 91322b088..b6d651856 100644 --- a/apps/governance/src/routes/proposals/components/proposals-list/proposals-list.tsx +++ b/apps/governance/src/routes/proposals/components/proposals-list/proposals-list.tsx @@ -16,14 +16,14 @@ import type { ProtocolUpgradeProposalFieldsFragment } from '@vegaprotocol/propos import { ExternalLinks } from '@vegaprotocol/environment'; interface ProposalsListProps { - proposals: Array; + proposals: Array; protocolUpgradeProposals: ProtocolUpgradeProposalFieldsFragment[]; lastBlockHeight?: string; } interface SortedProposalsProps { - open: Array; - closed: Array; + open: ProposalQuery['proposal'][]; + closed: ProposalQuery['proposal'][]; } interface SortedProtocolUpgradeProposalsProps { @@ -31,7 +31,7 @@ interface SortedProtocolUpgradeProposalsProps { closed: ProtocolUpgradeProposalFieldsFragment[]; } -export const orderByDate = (arr: ProposalFieldsFragment[]) => +export const orderByDate = (arr: ProposalQuery['proposal'][]) => orderBy( arr, [ @@ -92,12 +92,12 @@ export const ProposalsList = ({ return { open: initialSorting.open.length > 0 - ? orderByDate(initialSorting.open as ProposalFieldsFragment[]) + ? orderByDate(initialSorting.open as ProposalQuery['proposal'][]) : [], closed: initialSorting.closed.length > 0 ? orderByDate( - initialSorting.closed as ProposalFieldsFragment[] + initialSorting.closed as ProposalQuery['proposal'][] ).reverse() : [], }; diff --git a/apps/governance/src/routes/proposals/components/proposals-list/rejected-proposals-list.tsx b/apps/governance/src/routes/proposals/components/proposals-list/rejected-proposals-list.tsx index 0b128df9d..64a90752a 100644 --- a/apps/governance/src/routes/proposals/components/proposals-list/rejected-proposals-list.tsx +++ b/apps/governance/src/routes/proposals/components/proposals-list/rejected-proposals-list.tsx @@ -3,20 +3,17 @@ import { useTranslation } from 'react-i18next'; import { Heading } from '../../../../components/heading'; import { ProposalsListItem } from '../proposals-list-item'; import { ProposalsListFilter } from '../proposals-list-filter'; -import type { ProposalFieldsFragment } from '../../proposals/__generated__/Proposals'; import type { ProposalQuery } from '../../proposal/__generated__/Proposal'; interface ProposalsListProps { - proposals: Array; + proposals: ProposalQuery['proposal'][]; } export const RejectedProposalsList = ({ proposals }: ProposalsListProps) => { const { t } = useTranslation(); const [filterString, setFilterString] = useState(''); - const filterPredicate = ( - p: ProposalFieldsFragment | ProposalQuery['proposal'] - ) => + const filterPredicate = (p: ProposalQuery['proposal']) => p?.id?.includes(filterString) || p?.party?.id?.toString().includes(filterString); diff --git a/apps/governance/src/routes/proposals/proposal/Proposal.graphql b/apps/governance/src/routes/proposals/proposal/Proposal.graphql index 8cc991576..d5afe0add 100644 --- a/apps/governance/src/routes/proposals/proposal/Proposal.graphql +++ b/apps/governance/src/routes/proposals/proposal/Proposal.graphql @@ -1,4 +1,18 @@ -query Proposal($proposalId: ID!) { +fragment NewMarketProductField on Proposal { + terms { + change { + ... on NewMarket { + instrument { + product { + __typename + } + } + } + } + } +} + +query Proposal($proposalId: ID!, $includeNewMarketProductField: Boolean!) { proposal(id: $proposalId) { id rationale { @@ -13,6 +27,7 @@ query Proposal($proposalId: ID!) { id } errorDetails + ...NewMarketProductField @include(if: $includeNewMarketProductField) terms { closingDatetime enactmentDatetime diff --git a/apps/governance/src/routes/proposals/proposal/__generated__/Proposal.ts b/apps/governance/src/routes/proposals/proposal/__generated__/Proposal.ts index fa7e80408..2aed6a862 100644 --- a/apps/governance/src/routes/proposals/proposal/__generated__/Proposal.ts +++ b/apps/governance/src/routes/proposals/proposal/__generated__/Proposal.ts @@ -3,16 +3,33 @@ import * as Types from '@vegaprotocol/types'; import { gql } from '@apollo/client'; import * as Apollo from '@apollo/client'; const defaultOptions = {} as const; +export type NewMarketProductFieldFragment = { __typename?: 'Proposal', terms: { __typename?: 'ProposalTerms', change: { __typename?: 'CancelTransfer' } | { __typename?: 'NewAsset' } | { __typename?: 'NewFreeform' } | { __typename?: 'NewMarket', instrument: { __typename?: 'InstrumentConfiguration', product?: { __typename: 'FutureProduct' } | { __typename: 'PerpetualProduct' } | { __typename: 'SpotProduct' } | null } } | { __typename?: 'NewSpotMarket' } | { __typename?: 'NewTransfer' } | { __typename?: 'UpdateAsset' } | { __typename?: 'UpdateMarket' } | { __typename?: 'UpdateMarketState' } | { __typename?: 'UpdateNetworkParameter' } | { __typename?: 'UpdateReferralProgram' } | { __typename?: 'UpdateSpotMarket' } | { __typename?: 'UpdateVolumeDiscountProgram' } } }; + export type ProposalQueryVariables = Types.Exact<{ proposalId: Types.Scalars['ID']; + includeNewMarketProductField: Types.Scalars['Boolean']; }>; -export type ProposalQuery = { __typename?: 'Query', proposal?: { __typename?: 'Proposal', id?: string | null, reference: string, state: Types.ProposalState, datetime: any, rejectionReason?: Types.ProposalRejectionReason | null, errorDetails?: string | null, rationale: { __typename?: 'ProposalRationale', title: string, description: string }, party: { __typename?: 'Party', id: string }, terms: { __typename?: 'ProposalTerms', closingDatetime: any, enactmentDatetime?: any | null, change: { __typename?: 'CancelTransfer' } | { __typename?: 'NewAsset', name: string, symbol: string, decimals: number, quantum: string, source: { __typename?: 'BuiltinAsset', maxFaucetAmountMint: string } | { __typename?: 'ERC20', contractAddress: string, lifetimeLimit: string, withdrawThreshold: string } } | { __typename?: 'NewFreeform' } | { __typename?: 'NewMarket', decimalPlaces: number, metadata?: Array | null, positionDecimalPlaces: number, linearSlippageFactor: string, quadraticSlippageFactor: string, riskParameters: { __typename?: 'LogNormalRiskModel', riskAversionParameter: number, tau: number, params: { __typename?: 'LogNormalModelParams', mu: number, r: number, sigma: number } } | { __typename?: 'SimpleRiskModel', params: { __typename?: 'SimpleRiskModelParams', factorLong: number, factorShort: number } }, instrument: { __typename?: 'InstrumentConfiguration', name: string, code: string, futureProduct?: { __typename?: 'FutureProduct', quoteName: string, settlementAsset: { __typename?: 'Asset', id: string, name: string, symbol: string, decimals: number, quantum: string }, dataSourceSpecForSettlementData: { __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', operator: Types.ConditionOperator, value?: string | null }> | null }> | null } | { __typename?: 'EthCallSpec' } } | { __typename?: 'DataSourceDefinitionInternal', sourceType: { __typename?: 'DataSourceSpecConfigurationTime', conditions: Array<{ __typename?: 'Condition', operator: Types.ConditionOperator, value?: string | null } | null> } | { __typename?: 'DataSourceSpecConfigurationTimeTrigger' } } }, dataSourceSpecBinding: { __typename?: 'DataSourceSpecToFutureBinding', settlementDataProperty: string, tradingTerminationProperty: string } } | null }, priceMonitoringParameters: { __typename?: 'PriceMonitoringParameters', triggers?: Array<{ __typename?: 'PriceMonitoringTrigger', horizonSecs: number, probability: number, auctionExtensionSecs: number }> | null }, liquidityMonitoringParameters: { __typename?: 'LiquidityMonitoringParameters', triggeringRatio: string, targetStakeParameters: { __typename?: 'TargetStakeParameters', timeWindow: number, scalingFactor: number } } } | { __typename?: 'NewSpotMarket' } | { __typename?: 'NewTransfer' } | { __typename?: 'UpdateAsset', quantum: string, assetId: string, source: { __typename?: 'UpdateERC20', lifetimeLimit: string, withdrawThreshold: string } } | { __typename?: 'UpdateMarket', marketId: string, updateMarketConfiguration: { __typename?: 'UpdateMarketConfiguration', metadata?: Array | null, instrument: { __typename?: 'UpdateInstrumentConfiguration', code: string, product: { __typename?: 'UpdateFutureProduct', quoteName: string, dataSourceSpecForSettlementData: { __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', operator: Types.ConditionOperator, value?: string | null }> | null }> | null } | { __typename?: 'EthCallSpec' } } | { __typename?: 'DataSourceDefinitionInternal', sourceType: { __typename?: 'DataSourceSpecConfigurationTime', conditions: Array<{ __typename?: 'Condition', operator: Types.ConditionOperator, value?: string | null } | null> } | { __typename?: 'DataSourceSpecConfigurationTimeTrigger' } } }, dataSourceSpecBinding: { __typename?: 'DataSourceSpecToFutureBinding', settlementDataProperty: string, tradingTerminationProperty: string } } | { __typename?: 'UpdatePerpetualProduct', quoteName: string, dataSourceSpecForSettlementData: { __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', operator: Types.ConditionOperator, value?: string | null }> | null }> | null } | { __typename?: 'EthCallSpec' } } | { __typename?: 'DataSourceDefinitionInternal', sourceType: { __typename?: 'DataSourceSpecConfigurationTime', conditions: Array<{ __typename?: 'Condition', operator: Types.ConditionOperator, value?: string | null } | null> } | { __typename?: 'DataSourceSpecConfigurationTimeTrigger' } } }, dataSourceSpecBinding: { __typename?: 'DataSourceSpecPerpetualBinding', settlementDataProperty: string, settlementScheduleProperty: string } } }, priceMonitoringParameters: { __typename?: 'PriceMonitoringParameters', triggers?: Array<{ __typename?: 'PriceMonitoringTrigger', horizonSecs: number, probability: number, auctionExtensionSecs: number }> | null }, liquidityMonitoringParameters: { __typename?: 'LiquidityMonitoringParameters', triggeringRatio: string, targetStakeParameters: { __typename?: 'TargetStakeParameters', timeWindow: number, scalingFactor: number } }, riskParameters: { __typename?: 'UpdateMarketLogNormalRiskModel', logNormal?: { __typename?: 'LogNormalRiskModel', riskAversionParameter: number, tau: number, params: { __typename?: 'LogNormalModelParams', r: number, sigma: number, mu: number } } | null } | { __typename?: 'UpdateMarketSimpleRiskModel', simple?: { __typename?: 'SimpleRiskModelParams', factorLong: number, factorShort: number } | null } } } | { __typename?: 'UpdateMarketState' } | { __typename?: 'UpdateNetworkParameter', networkParameter: { __typename?: 'NetworkParameter', key: string, value: string } } | { __typename?: 'UpdateReferralProgram' } | { __typename?: 'UpdateSpotMarket' } | { __typename?: 'UpdateVolumeDiscountProgram' } }, votes: { __typename?: 'ProposalVotes', yes: { __typename?: 'ProposalVoteSide', totalTokens: string, totalNumber: string, totalEquityLikeShareWeight: string }, no: { __typename?: 'ProposalVoteSide', totalTokens: string, totalNumber: string, totalEquityLikeShareWeight: string } } } | null }; - +export type ProposalQuery = { __typename?: 'Query', proposal?: { __typename?: 'Proposal', id?: string | null, reference: string, state: Types.ProposalState, datetime: any, rejectionReason?: Types.ProposalRejectionReason | null, errorDetails?: string | null, rationale: { __typename?: 'ProposalRationale', title: string, description: string }, party: { __typename?: 'Party', id: string }, terms: { __typename?: 'ProposalTerms', closingDatetime: any, enactmentDatetime?: any | null, change: { __typename?: 'CancelTransfer' } | { __typename?: 'NewAsset', name: string, symbol: string, decimals: number, quantum: string, source: { __typename?: 'BuiltinAsset', maxFaucetAmountMint: string } | { __typename?: 'ERC20', contractAddress: string, lifetimeLimit: string, withdrawThreshold: string } } | { __typename?: 'NewFreeform' } | { __typename?: 'NewMarket', decimalPlaces: number, metadata?: Array | null, positionDecimalPlaces: number, linearSlippageFactor: string, quadraticSlippageFactor: string, riskParameters: { __typename?: 'LogNormalRiskModel', riskAversionParameter: number, tau: number, params: { __typename?: 'LogNormalModelParams', mu: number, r: number, sigma: number } } | { __typename?: 'SimpleRiskModel', params: { __typename?: 'SimpleRiskModelParams', factorLong: number, factorShort: number } }, instrument: { __typename?: 'InstrumentConfiguration', name: string, code: string, futureProduct?: { __typename?: 'FutureProduct', quoteName: string, settlementAsset: { __typename?: 'Asset', id: string, name: string, symbol: string, decimals: number, quantum: string }, dataSourceSpecForSettlementData: { __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', operator: Types.ConditionOperator, value?: string | null }> | null }> | null } | { __typename?: 'EthCallSpec' } } | { __typename?: 'DataSourceDefinitionInternal', sourceType: { __typename?: 'DataSourceSpecConfigurationTime', conditions: Array<{ __typename?: 'Condition', operator: Types.ConditionOperator, value?: string | null } | null> } | { __typename?: 'DataSourceSpecConfigurationTimeTrigger' } } }, dataSourceSpecBinding: { __typename?: 'DataSourceSpecToFutureBinding', settlementDataProperty: string, tradingTerminationProperty: string } } | null, product?: { __typename: 'FutureProduct' } | { __typename: 'PerpetualProduct' } | { __typename: 'SpotProduct' } | null }, priceMonitoringParameters: { __typename?: 'PriceMonitoringParameters', triggers?: Array<{ __typename?: 'PriceMonitoringTrigger', horizonSecs: number, probability: number, auctionExtensionSecs: number }> | null }, liquidityMonitoringParameters: { __typename?: 'LiquidityMonitoringParameters', triggeringRatio: string, targetStakeParameters: { __typename?: 'TargetStakeParameters', timeWindow: number, scalingFactor: number } } } | { __typename?: 'NewSpotMarket' } | { __typename?: 'NewTransfer' } | { __typename?: 'UpdateAsset', quantum: string, assetId: string, source: { __typename?: 'UpdateERC20', lifetimeLimit: string, withdrawThreshold: string } } | { __typename?: 'UpdateMarket', marketId: string, updateMarketConfiguration: { __typename?: 'UpdateMarketConfiguration', metadata?: Array | null, instrument: { __typename?: 'UpdateInstrumentConfiguration', code: string, product: { __typename?: 'UpdateFutureProduct', quoteName: string, dataSourceSpecForSettlementData: { __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', operator: Types.ConditionOperator, value?: string | null }> | null }> | null } | { __typename?: 'EthCallSpec' } } | { __typename?: 'DataSourceDefinitionInternal', sourceType: { __typename?: 'DataSourceSpecConfigurationTime', conditions: Array<{ __typename?: 'Condition', operator: Types.ConditionOperator, value?: string | null } | null> } | { __typename?: 'DataSourceSpecConfigurationTimeTrigger' } } }, dataSourceSpecBinding: { __typename?: 'DataSourceSpecToFutureBinding', settlementDataProperty: string, tradingTerminationProperty: string } } | { __typename?: 'UpdatePerpetualProduct', quoteName: string, dataSourceSpecForSettlementData: { __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', operator: Types.ConditionOperator, value?: string | null }> | null }> | null } | { __typename?: 'EthCallSpec' } } | { __typename?: 'DataSourceDefinitionInternal', sourceType: { __typename?: 'DataSourceSpecConfigurationTime', conditions: Array<{ __typename?: 'Condition', operator: Types.ConditionOperator, value?: string | null } | null> } | { __typename?: 'DataSourceSpecConfigurationTimeTrigger' } } }, dataSourceSpecBinding: { __typename?: 'DataSourceSpecPerpetualBinding', settlementDataProperty: string, settlementScheduleProperty: string } } }, priceMonitoringParameters: { __typename?: 'PriceMonitoringParameters', triggers?: Array<{ __typename?: 'PriceMonitoringTrigger', horizonSecs: number, probability: number, auctionExtensionSecs: number }> | null }, liquidityMonitoringParameters: { __typename?: 'LiquidityMonitoringParameters', triggeringRatio: string, targetStakeParameters: { __typename?: 'TargetStakeParameters', timeWindow: number, scalingFactor: number } }, riskParameters: { __typename?: 'UpdateMarketLogNormalRiskModel', logNormal?: { __typename?: 'LogNormalRiskModel', riskAversionParameter: number, tau: number, params: { __typename?: 'LogNormalModelParams', r: number, sigma: number, mu: number } } | null } | { __typename?: 'UpdateMarketSimpleRiskModel', simple?: { __typename?: 'SimpleRiskModelParams', factorLong: number, factorShort: number } | null } } } | { __typename?: 'UpdateMarketState' } | { __typename?: 'UpdateNetworkParameter', networkParameter: { __typename?: 'NetworkParameter', key: string, value: string } } | { __typename?: 'UpdateReferralProgram' } | { __typename?: 'UpdateSpotMarket' } | { __typename?: 'UpdateVolumeDiscountProgram' } }, votes: { __typename?: 'ProposalVotes', yes: { __typename?: 'ProposalVoteSide', totalTokens: string, totalNumber: string, totalEquityLikeShareWeight: string }, no: { __typename?: 'ProposalVoteSide', totalTokens: string, totalNumber: string, totalEquityLikeShareWeight: string } } } | null }; +export const NewMarketProductFieldFragmentDoc = gql` + fragment NewMarketProductField on Proposal { + terms { + change { + ... on NewMarket { + instrument { + product { + __typename + } + } + } + } + } +} + `; export const ProposalDocument = gql` - query Proposal($proposalId: ID!) { + query Proposal($proposalId: ID!, $includeNewMarketProductField: Boolean!) { proposal(id: $proposalId) { id rationale { @@ -27,6 +44,7 @@ export const ProposalDocument = gql` id } errorDetails + ...NewMarketProductField @include(if: $includeNewMarketProductField) terms { closingDatetime enactmentDatetime @@ -313,7 +331,7 @@ export const ProposalDocument = gql` } } } - `; + ${NewMarketProductFieldFragmentDoc}`; /** * __useProposalQuery__ @@ -328,6 +346,7 @@ export const ProposalDocument = gql` * const { data, loading, error } = useProposalQuery({ * variables: { * proposalId: // value for 'proposalId' + * includeNewMarketProductField: // value for 'includeNewMarketProductField' * }, * }); */ diff --git a/apps/governance/src/routes/proposals/proposal/proposal-container.tsx b/apps/governance/src/routes/proposals/proposal/proposal-container.tsx index 7f2114eed..a097e9d54 100644 --- a/apps/governance/src/routes/proposals/proposal/proposal-container.tsx +++ b/apps/governance/src/routes/proposals/proposal/proposal-container.tsx @@ -53,7 +53,10 @@ export const ProposalContainer = () => { const { data, loading, error, refetch } = useProposalQuery({ fetchPolicy: 'network-only', errorPolicy: 'ignore', - variables: { proposalId: params.proposalId || '' }, + variables: { + proposalId: params.proposalId || '', + includeNewMarketProductField: !!FLAGS.PRODUCT_PERPETUALS, + }, skip: !params.proposalId, }); diff --git a/apps/governance/src/routes/proposals/proposals/Proposals.graphql b/apps/governance/src/routes/proposals/proposals/Proposals.graphql index ef67a2e9c..8b26532ee 100644 --- a/apps/governance/src/routes/proposals/proposals/Proposals.graphql +++ b/apps/governance/src/routes/proposals/proposals/Proposals.graphql @@ -1,3 +1,17 @@ +fragment NewMarketProductFields on Proposal { + terms { + change { + ... on NewMarket { + instrument { + product { + __typename + } + } + } + } + } +} + fragment ProposalFields on Proposal { id rationale { @@ -79,11 +93,12 @@ fragment ProposalFields on Proposal { } } -query Proposals { +query Proposals($includeNewMarketProductFields: Boolean!) { proposalsConnection { edges { node { ...ProposalFields + ...NewMarketProductFields @include(if: $includeNewMarketProductFields) } } } diff --git a/apps/governance/src/routes/proposals/proposals/__generated__/Proposals.ts b/apps/governance/src/routes/proposals/proposals/__generated__/Proposals.ts index 8f8d7e443..f60005df4 100644 --- a/apps/governance/src/routes/proposals/proposals/__generated__/Proposals.ts +++ b/apps/governance/src/routes/proposals/proposals/__generated__/Proposals.ts @@ -3,13 +3,32 @@ import * as Types from '@vegaprotocol/types'; import { gql } from '@apollo/client'; import * as Apollo from '@apollo/client'; const defaultOptions = {} as const; +export type NewMarketProductFieldsFragment = { __typename?: 'Proposal', terms: { __typename?: 'ProposalTerms', change: { __typename?: 'CancelTransfer' } | { __typename?: 'NewAsset' } | { __typename?: 'NewFreeform' } | { __typename?: 'NewMarket', instrument: { __typename?: 'InstrumentConfiguration', product?: { __typename: 'FutureProduct' } | { __typename: 'PerpetualProduct' } | { __typename: 'SpotProduct' } | null } } | { __typename?: 'NewSpotMarket' } | { __typename?: 'NewTransfer' } | { __typename?: 'UpdateAsset' } | { __typename?: 'UpdateMarket' } | { __typename?: 'UpdateMarketState' } | { __typename?: 'UpdateNetworkParameter' } | { __typename?: 'UpdateReferralProgram' } | { __typename?: 'UpdateSpotMarket' } | { __typename?: 'UpdateVolumeDiscountProgram' } } }; + export type ProposalFieldsFragment = { __typename?: 'Proposal', id?: string | null, reference: string, state: Types.ProposalState, datetime: any, rejectionReason?: Types.ProposalRejectionReason | null, errorDetails?: string | null, rationale: { __typename?: 'ProposalRationale', title: string, description: string }, party: { __typename?: 'Party', id: string }, terms: { __typename?: 'ProposalTerms', closingDatetime: any, enactmentDatetime?: any | null, change: { __typename?: 'CancelTransfer' } | { __typename: 'NewAsset', name: string, symbol: string, decimals: number, quantum: string, source: { __typename?: 'BuiltinAsset', maxFaucetAmountMint: string } | { __typename?: 'ERC20', contractAddress: string, withdrawThreshold: string, lifetimeLimit: string } } | { __typename?: 'NewFreeform' } | { __typename?: 'NewMarket', instrument: { __typename?: 'InstrumentConfiguration', name: string, code: string, futureProduct?: { __typename?: 'FutureProduct', settlementAsset: { __typename?: 'Asset', symbol: string } } | null } } | { __typename?: 'NewSpotMarket' } | { __typename?: 'NewTransfer' } | { __typename?: 'UpdateAsset', quantum: string, assetId: string, source: { __typename?: 'UpdateERC20', lifetimeLimit: string, withdrawThreshold: string } } | { __typename?: 'UpdateMarket', marketId: string } | { __typename?: 'UpdateMarketState' } | { __typename?: 'UpdateNetworkParameter', networkParameter: { __typename?: 'NetworkParameter', key: string, value: string } } | { __typename?: 'UpdateReferralProgram' } | { __typename?: 'UpdateSpotMarket' } | { __typename?: 'UpdateVolumeDiscountProgram' } }, votes: { __typename?: 'ProposalVotes', yes: { __typename?: 'ProposalVoteSide', totalTokens: string, totalNumber: string, totalEquityLikeShareWeight: string }, no: { __typename?: 'ProposalVoteSide', totalTokens: string, totalNumber: string, totalEquityLikeShareWeight: string } } }; -export type ProposalsQueryVariables = Types.Exact<{ [key: string]: never; }>; +export type ProposalsQueryVariables = Types.Exact<{ + includeNewMarketProductFields: Types.Scalars['Boolean']; +}>; -export type ProposalsQuery = { __typename?: 'Query', proposalsConnection?: { __typename?: 'ProposalsConnection', edges?: Array<{ __typename?: 'ProposalEdge', node: { __typename?: 'Proposal', id?: string | null, reference: string, state: Types.ProposalState, datetime: any, rejectionReason?: Types.ProposalRejectionReason | null, errorDetails?: string | null, rationale: { __typename?: 'ProposalRationale', title: string, description: string }, party: { __typename?: 'Party', id: string }, terms: { __typename?: 'ProposalTerms', closingDatetime: any, enactmentDatetime?: any | null, change: { __typename?: 'CancelTransfer' } | { __typename: 'NewAsset', name: string, symbol: string, decimals: number, quantum: string, source: { __typename?: 'BuiltinAsset', maxFaucetAmountMint: string } | { __typename?: 'ERC20', contractAddress: string, withdrawThreshold: string, lifetimeLimit: string } } | { __typename?: 'NewFreeform' } | { __typename?: 'NewMarket', instrument: { __typename?: 'InstrumentConfiguration', name: string, code: string, futureProduct?: { __typename?: 'FutureProduct', settlementAsset: { __typename?: 'Asset', symbol: string } } | null } } | { __typename?: 'NewSpotMarket' } | { __typename?: 'NewTransfer' } | { __typename?: 'UpdateAsset', quantum: string, assetId: string, source: { __typename?: 'UpdateERC20', lifetimeLimit: string, withdrawThreshold: string } } | { __typename?: 'UpdateMarket', marketId: string } | { __typename?: 'UpdateMarketState' } | { __typename?: 'UpdateNetworkParameter', networkParameter: { __typename?: 'NetworkParameter', key: string, value: string } } | { __typename?: 'UpdateReferralProgram' } | { __typename?: 'UpdateSpotMarket' } | { __typename?: 'UpdateVolumeDiscountProgram' } }, votes: { __typename?: 'ProposalVotes', yes: { __typename?: 'ProposalVoteSide', totalTokens: string, totalNumber: string, totalEquityLikeShareWeight: string }, no: { __typename?: 'ProposalVoteSide', totalTokens: string, totalNumber: string, totalEquityLikeShareWeight: string } } } } | null> | null } | null }; +export type ProposalsQuery = { __typename?: 'Query', proposalsConnection?: { __typename?: 'ProposalsConnection', edges?: Array<{ __typename?: 'ProposalEdge', node: { __typename?: 'Proposal', id?: string | null, reference: string, state: Types.ProposalState, datetime: any, rejectionReason?: Types.ProposalRejectionReason | null, errorDetails?: string | null, rationale: { __typename?: 'ProposalRationale', title: string, description: string }, party: { __typename?: 'Party', id: string }, terms: { __typename?: 'ProposalTerms', closingDatetime: any, enactmentDatetime?: any | null, change: { __typename?: 'CancelTransfer' } | { __typename: 'NewAsset', name: string, symbol: string, decimals: number, quantum: string, source: { __typename?: 'BuiltinAsset', maxFaucetAmountMint: string } | { __typename?: 'ERC20', contractAddress: string, withdrawThreshold: string, lifetimeLimit: string } } | { __typename?: 'NewFreeform' } | { __typename?: 'NewMarket', instrument: { __typename?: 'InstrumentConfiguration', name: string, code: string, futureProduct?: { __typename?: 'FutureProduct', settlementAsset: { __typename?: 'Asset', symbol: string } } | null, product?: { __typename: 'FutureProduct' } | { __typename: 'PerpetualProduct' } | { __typename: 'SpotProduct' } | null } } | { __typename?: 'NewSpotMarket' } | { __typename?: 'NewTransfer' } | { __typename?: 'UpdateAsset', quantum: string, assetId: string, source: { __typename?: 'UpdateERC20', lifetimeLimit: string, withdrawThreshold: string } } | { __typename?: 'UpdateMarket', marketId: string } | { __typename?: 'UpdateMarketState' } | { __typename?: 'UpdateNetworkParameter', networkParameter: { __typename?: 'NetworkParameter', key: string, value: string } } | { __typename?: 'UpdateReferralProgram' } | { __typename?: 'UpdateSpotMarket' } | { __typename?: 'UpdateVolumeDiscountProgram' } }, votes: { __typename?: 'ProposalVotes', yes: { __typename?: 'ProposalVoteSide', totalTokens: string, totalNumber: string, totalEquityLikeShareWeight: string }, no: { __typename?: 'ProposalVoteSide', totalTokens: string, totalNumber: string, totalEquityLikeShareWeight: string } } } } | null> | null } | null }; +export const NewMarketProductFieldsFragmentDoc = gql` + fragment NewMarketProductFields on Proposal { + terms { + change { + ... on NewMarket { + instrument { + product { + __typename + } + } + } + } + } +} + `; export const ProposalFieldsFragmentDoc = gql` fragment ProposalFields on Proposal { id @@ -93,16 +112,18 @@ export const ProposalFieldsFragmentDoc = gql` } `; export const ProposalsDocument = gql` - query Proposals { + query Proposals($includeNewMarketProductFields: Boolean!) { proposalsConnection { edges { node { ...ProposalFields + ...NewMarketProductFields @include(if: $includeNewMarketProductFields) } } } } - ${ProposalFieldsFragmentDoc}`; + ${ProposalFieldsFragmentDoc} +${NewMarketProductFieldsFragmentDoc}`; /** * __useProposalsQuery__ @@ -116,10 +137,11 @@ export const ProposalsDocument = gql` * @example * const { data, loading, error } = useProposalsQuery({ * variables: { + * includeNewMarketProductFields: // value for 'includeNewMarketProductFields' * }, * }); */ -export function useProposalsQuery(baseOptions?: Apollo.QueryHookOptions) { +export function useProposalsQuery(baseOptions: Apollo.QueryHookOptions) { const options = {...defaultOptions, ...baseOptions} return Apollo.useQuery(ProposalsDocument, options); } diff --git a/apps/governance/src/routes/proposals/proposals/proposals-container.tsx b/apps/governance/src/routes/proposals/proposals/proposals-container.tsx index 16790f082..fbc2293e1 100644 --- a/apps/governance/src/routes/proposals/proposals/proposals-container.tsx +++ b/apps/governance/src/routes/proposals/proposals/proposals-container.tsx @@ -6,7 +6,7 @@ import { useTranslation } from 'react-i18next'; import { SplashLoader } from '../../../components/splash-loader'; import { ProposalsList } from '../components/proposals-list'; import { useProposalsQuery } from './__generated__/Proposals'; -import { getNodes } from '@vegaprotocol/utils'; +import { getNodes, removePaginationWrapper } from '@vegaprotocol/utils'; import { ProposalState, ProtocolUpgradeProposalStatus, @@ -15,14 +15,13 @@ import type { NodeConnection, NodeEdge } from '@vegaprotocol/utils'; import type { ProposalFieldsFragment } from './__generated__/Proposals'; import type { ProtocolUpgradeProposalFieldsFragment } from '@vegaprotocol/proposals'; import { useProtocolUpgradeProposalsQuery } from '@vegaprotocol/proposals'; +import { FLAGS } from '@vegaprotocol/environment'; -export function getNotRejectedProposals( - data?: NodeConnection> | null -): T[] { +export function getNotRejectedProposals(data?: ProposalFieldsFragment[]) { return flow([ (data) => - getNodes(data, (p) => - p ? p.state !== ProposalState.STATE_REJECTED : false + data.filter( + (p: ProposalFieldsFragment) => p?.state !== ProposalState.STATE_REJECTED ), ])(data); } @@ -47,6 +46,9 @@ export const ProposalsContainer = () => { pollInterval: 5000, fetchPolicy: 'network-only', errorPolicy: 'ignore', + variables: { + includeNewMarketProductFields: !!FLAGS.PRODUCT_PERPETUALS, + }, }); const { @@ -60,7 +62,10 @@ export const ProposalsContainer = () => { }); const proposals = useMemo( - () => getNotRejectedProposals(data?.proposalsConnection), + () => + getNotRejectedProposals( + removePaginationWrapper(data?.proposalsConnection?.edges) + ), [data] ); diff --git a/apps/governance/src/routes/proposals/rejected/rejected-proposals-container.tsx b/apps/governance/src/routes/proposals/rejected/rejected-proposals-container.tsx index bf20b4ee7..784131261 100644 --- a/apps/governance/src/routes/proposals/rejected/rejected-proposals-container.tsx +++ b/apps/governance/src/routes/proposals/rejected/rejected-proposals-container.tsx @@ -6,11 +6,11 @@ import { SplashLoader } from '../../../components/splash-loader'; import { RejectedProposalsList } from '../components/proposals-list'; import type { ProposalFieldsFragment } from '../proposals/__generated__/Proposals'; import { useProposalsQuery } from '../proposals/__generated__/Proposals'; -import type { NodeConnection, NodeEdge } from '@vegaprotocol/utils'; -import { getNodes } from '@vegaprotocol/utils'; +import { removePaginationWrapper } from '@vegaprotocol/utils'; import flow from 'lodash/flow'; import orderBy from 'lodash/orderBy'; import { ProposalState } from '@vegaprotocol/types'; +import { FLAGS } from '@vegaprotocol/environment'; const orderByDate = (arr: ProposalFieldsFragment[]) => orderBy( @@ -22,13 +22,11 @@ const orderByDate = (arr: ProposalFieldsFragment[]) => ['desc', 'desc'] ); -export function getRejectedProposals( - data?: NodeConnection> | null -): T[] { +export function getRejectedProposals(data?: ProposalFieldsFragment[] | null) { return flow([ (data) => - getNodes(data, (p) => - p ? p?.state === ProposalState.STATE_REJECTED : false + data.filter( + (p: ProposalFieldsFragment) => p?.state === ProposalState.STATE_REJECTED ), orderByDate, ])(data); @@ -36,11 +34,20 @@ export function getRejectedProposals( export const RejectedProposalsContainer = () => { const { t } = useTranslation(); - const { data, loading, error } = useProposalsQuery(); + const { data, loading, error } = useProposalsQuery({ + pollInterval: 5000, + fetchPolicy: 'network-only', + errorPolicy: 'ignore', + variables: { + includeNewMarketProductFields: !!FLAGS.PRODUCT_PERPETUALS, + }, + }); const proposals = useMemo( () => - getRejectedProposals(data?.proposalsConnection), + getRejectedProposals( + removePaginationWrapper(data?.proposalsConnection?.edges) + ), [data] ); diff --git a/apps/governance/src/routes/rewards/epoch-individual-rewards/epoch-individual-rewards.tsx b/apps/governance/src/routes/rewards/epoch-individual-rewards/epoch-individual-rewards.tsx index e96c7395a..ff431ceb9 100644 --- a/apps/governance/src/routes/rewards/epoch-individual-rewards/epoch-individual-rewards.tsx +++ b/apps/governance/src/routes/rewards/epoch-individual-rewards/epoch-individual-rewards.tsx @@ -1,4 +1,4 @@ -import { useMemo, useEffect, useState, useCallback } from 'react'; +import { useMemo, useEffect, useState, useCallback, useRef } from 'react'; import { useTranslation } from 'react-i18next'; import { AsyncRenderer, Pagination } from '@vegaprotocol/ui-toolkit'; import { removePaginationWrapper } from '@vegaprotocol/utils'; @@ -86,12 +86,18 @@ export const EpochIndividualRewards = ({ [epochId, page, refetch, delegationsPagination, pubKey] ); + const prevEpochIdRef = useRef(null); + useEffect(() => { - // when the epoch changes, we want to refetch the data to update the current page - if (data) { + if (prevEpochIdRef.current === null) { + prevEpochIdRef.current = epochId; + } else if (epochId !== prevEpochIdRef.current) { + // When the epoch changes, we want to refetch the data to update the current page refetchData(); } - }, [epochId, data, refetchData]); + + prevEpochIdRef.current = epochId; + }, [epochId, refetchData]); return ( -
+
{params?.data?.rankingDisplay}
-
+
-

+

{t( 'Validators with too great a stake share will have the staking rewards for their delegators penalised.' )} diff --git a/apps/governance/src/routes/staking/home/validator-tables/standby-pending-validators-table.tsx b/apps/governance/src/routes/staking/home/validator-tables/standby-pending-validators-table.tsx index f1553756a..164f29b4f 100644 --- a/apps/governance/src/routes/staking/home/validator-tables/standby-pending-validators-table.tsx +++ b/apps/governance/src/routes/staking/home/validator-tables/standby-pending-validators-table.tsx @@ -1,7 +1,7 @@ import { forwardRef, useMemo, useRef } from 'react'; import { useTranslation } from 'react-i18next'; import { useNavigate } from 'react-router-dom'; -import { AgGridLazy as AgGrid } from '@vegaprotocol/datagrid'; +import { AgGrid } from '@vegaprotocol/datagrid'; import { useAppState } from '../../../../contexts/app-state/app-state-context'; import { BigNumber } from '../../../../lib/bignumber'; import { diff --git a/apps/trading/client-pages/markets/closed.tsx b/apps/trading/client-pages/markets/closed.tsx index 23ff589cc..de2a71f63 100644 --- a/apps/trading/client-pages/markets/closed.tsx +++ b/apps/trading/client-pages/markets/closed.tsx @@ -4,7 +4,7 @@ import type { VegaICellRendererParams, VegaValueFormatterParams, } from '@vegaprotocol/datagrid'; -import { AgGridLazy as AgGrid, COL_DEFS } from '@vegaprotocol/datagrid'; +import { AgGrid, COL_DEFS } from '@vegaprotocol/datagrid'; import { useMemo } from 'react'; import { t } from '@vegaprotocol/i18n'; import type { Asset } from '@vegaprotocol/types'; diff --git a/apps/trading/client-pages/markets/market-list-table.tsx b/apps/trading/client-pages/markets/market-list-table.tsx index 6f1217807..46c3112ff 100644 --- a/apps/trading/client-pages/markets/market-list-table.tsx +++ b/apps/trading/client-pages/markets/market-list-table.tsx @@ -1,5 +1,5 @@ import type { TypedDataAgGrid } from '@vegaprotocol/datagrid'; -import { AgGridLazy as AgGrid, PriceFlashCell } from '@vegaprotocol/datagrid'; +import { AgGrid, PriceFlashCell } from '@vegaprotocol/datagrid'; import type { MarketMaybeWithData } from '@vegaprotocol/markets'; import { useColumnDefs } from './use-column-defs'; diff --git a/apps/trading/components/banner/announcement-banner.tsx b/apps/trading/components/banner/announcement-banner.tsx index 24ce66515..e0726129d 100644 --- a/apps/trading/components/banner/announcement-banner.tsx +++ b/apps/trading/components/banner/announcement-banner.tsx @@ -9,5 +9,11 @@ export const AnnouncementBanner = () => { return null; } - return ; + return ( + + ); }; diff --git a/apps/trading/components/header/header.tsx b/apps/trading/components/header/header.tsx index 58207e1b5..6ff4d50ee 100644 --- a/apps/trading/components/header/header.tsx +++ b/apps/trading/components/header/header.tsx @@ -53,7 +53,7 @@ export const HeaderStat = ({

{heading}
- +
{ return ( <> - { ); }; +const AssetSidebarButtons = () => { + const currentRouteId = useGetCurrentRouteId(); + + return ( + <> + + + + + ); +}; + export const Sidebar = () => { const currentRouteId = useGetCurrentRouteId(); const navClasses = 'flex lg:flex-col items-center gap-2 lg:gap-4 p-1'; @@ -80,41 +106,34 @@ export const Sidebar = () => { return (
diff --git a/apps/trading/pages/_document.page.tsx b/apps/trading/pages/_document.page.tsx index eedd78d36..b58ef8d04 100644 --- a/apps/trading/pages/_document.page.tsx +++ b/apps/trading/pages/_document.page.tsx @@ -4,33 +4,24 @@ export default function Document() { return ( <> - {/* + {/* meta tags - - next advised against using _document for this, so they exist in our + - next advised against using _document for this, so they exist in our - single page index.page.tsx */} - {/* icons */} - - - - {/* fonts */} + {/* preload fonts */} - {/* styles */} - + {/* icons */} + + + {/* eslint-disable-next-line @next/next/no-css-tags */} diff --git a/apps/trading/pages/index.page.tsx b/apps/trading/pages/index.page.tsx index 6e39dde55..3278d530b 100644 --- a/apps/trading/pages/index.page.tsx +++ b/apps/trading/pages/index.page.tsx @@ -19,17 +19,11 @@ export default function Index() { - - + + - + diff --git a/apps/trading/pages/styles.css b/apps/trading/pages/styles.css index 7d4f32462..88db4c68f 100644 --- a/apps/trading/pages/styles.css +++ b/apps/trading/pages/styles.css @@ -1,6 +1,13 @@ @import 'ag-grid-community/styles/ag-grid.css'; @import 'ag-grid-community/styles/ag-theme-balham.css'; +/** Load AlphaLyrae font */ +@font-face { + font-family: AlphaLyrae; + src: url('/AlphaLyrae-Medium.woff2') format('woff2'), + url('/AlphaLyrae-Medium.woff') format('woff'); +} + @tailwind base; @tailwind components; @tailwind utilities; @@ -103,8 +110,8 @@ html [data-theme='light'] { --pennant-color-depth-sell-fill: theme(colors.market.red.DEFAULT); --pennant-color-depth-sell-stroke: theme(colors.market.red.650); - --pennant-color-volume-buy: theme(colors.market.green.300); - --pennant-color-volume-sell: theme(colors.market.red.300); + --pennant-color-volume-buy: theme(colors.market.green.DEFAULT); + --pennant-color-volume-sell: theme(colors.market.red.DEFAULT); } html [data-theme='dark'] { @@ -125,7 +132,7 @@ html [data-theme='dark'] { --pennant-color-depth-sell-stroke: theme(colors.market.red.DEFAULT); --pennant-color-volume-buy: theme(colors.market.green.600); - --pennant-color-volume-sell: theme(colors.market.red.650); + --pennant-color-volume-sell: theme(colors.market.red.DEFAULT); } /** diff --git a/apps/trading/public/AlphaLyrae-Medium.woff2 b/apps/trading/public/AlphaLyrae-Medium.woff2 new file mode 100644 index 000000000..061d86937 Binary files /dev/null and b/apps/trading/public/AlphaLyrae-Medium.woff2 differ diff --git a/apps/trading/public/banner-bg.jpg b/apps/trading/public/banner-bg.jpg new file mode 100644 index 000000000..6652fa4e6 Binary files /dev/null and b/apps/trading/public/banner-bg.jpg differ diff --git a/apps/trading/public/favicon.ico b/apps/trading/public/favicon.ico new file mode 100644 index 000000000..03a276d66 Binary files /dev/null and b/apps/trading/public/favicon.ico differ diff --git a/docker/entrypoint.sh b/docker/entrypoint.sh deleted file mode 100755 index c0ccf08a9..000000000 --- a/docker/entrypoint.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/sh - -entrypoint="${1:-nginx}" - -if [[ "$entrypoint" = "nginx" ]]; then - nginx -g 'daemon off;' -elif [[ "$entrypoint" = "ipfs" ]]; then - ipfs config profile apply server - ipfs config --json Addresses.Gateway '"/ip4/127.0.0.1/tcp/80"' - ipfs daemon -elif [[ "-c" ]]; then - shift - /bin/sh -c "$@" -fi diff --git a/libs/accounts/src/lib/accounts-table.tsx b/libs/accounts/src/lib/accounts-table.tsx index bbd9f7b94..b17901dd9 100644 --- a/libs/accounts/src/lib/accounts-table.tsx +++ b/libs/accounts/src/lib/accounts-table.tsx @@ -18,7 +18,7 @@ import { VegaIconNames, TooltipCellComponent, } from '@vegaprotocol/ui-toolkit'; -import { AgGridLazy as AgGrid } from '@vegaprotocol/datagrid'; +import { AgGrid } from '@vegaprotocol/datagrid'; import type { IGetRowsParams, IRowNode, diff --git a/libs/accounts/src/lib/breakdown-table.tsx b/libs/accounts/src/lib/breakdown-table.tsx index a782283f5..d7fc7ae26 100644 --- a/libs/accounts/src/lib/breakdown-table.tsx +++ b/libs/accounts/src/lib/breakdown-table.tsx @@ -13,7 +13,7 @@ import type { VegaICellRendererParams, } from '@vegaprotocol/datagrid'; import { ProgressBarCell } from '@vegaprotocol/datagrid'; -import { AgGridLazy as AgGrid, PriceCell } from '@vegaprotocol/datagrid'; +import { AgGrid, PriceCell } from '@vegaprotocol/datagrid'; import type { ColDef } from 'ag-grid-community'; import { accountValuesComparator } from './accounts-table'; import { MarginHealthChart } from './margin-health-chart'; diff --git a/libs/announcements/src/lib/announcements.tsx b/libs/announcements/src/lib/announcements.tsx index 8e56d6cf2..b9682390e 100644 --- a/libs/announcements/src/lib/announcements.tsx +++ b/libs/announcements/src/lib/announcements.tsx @@ -14,6 +14,7 @@ import { export type AnnouncementBannerProps = { app: AppNameType; configUrl: string; + background?: string; }; // run only if below the allowed maximum delay ~24.8 days (https://developer.mozilla.org/en-US/docs/Web/API/setTimeout#maximum_delay_value) @@ -36,6 +37,7 @@ const doesEndInTheFuture = (now: Date, data: Announcement) => { export const AnnouncementBanner = ({ app, configUrl, + background, }: AnnouncementBannerProps) => { const [isVisible, setVisible] = useState(false); const { data, reload } = useAnnouncement(app, configUrl); @@ -79,10 +81,10 @@ export const AnnouncementBanner = ({ } return ( - +
{data.text}{' '} {data.urlText && data.url && ( @@ -90,7 +92,7 @@ export const AnnouncementBanner = ({ )}