diff --git a/apps/explorer/.env.mainnet-mirror b/apps/explorer/.env.mainnet-mirror new file mode 100644 index 000000000..1299cb5cf --- /dev/null +++ b/apps/explorer/.env.mainnet-mirror @@ -0,0 +1,13 @@ +# 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_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_ENV=MAINNET-MIRROR +NX_BLOCK_EXPLORER=https://be.mainnet-mirror.vega.rocks/rest +NX_ETHERSCAN_URL=https://sepolia.etherscan.io +NX_VEGA_GOVERNANCE_URL=https://governance.mainnet-mirror.vega.rocks +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_CONSOLE_URL=https://console.mainnet-mirror.vega.rocks \ No newline at end of file diff --git a/apps/explorer/README.md b/apps/explorer/README.md index 33174c7e7..d7e603773 100644 --- a/apps/explorer/README.md +++ b/apps/explorer/README.md @@ -32,6 +32,7 @@ yarn nx serve explorer Example configurations are provided here: - [Mainnet](./.env.mainnet) +- [Mainnet-mirror](./.env.mainnet-mirror) - [Devnet](./.env.devnet) - [Capsule](./.env.capsule) - [Testnet](./.env.testnet) diff --git a/apps/governance/.env.mainnet-mirror b/apps/governance/.env.mainnet-mirror new file mode 100644 index 000000000..711cfe742 --- /dev/null +++ b/apps/governance/.env.mainnet-mirror @@ -0,0 +1,15 @@ +# App configuration variables +NX_VEGA_ENV=MAINNET-MIRROR +NX_VEGA_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/networks-internal/main/mainnet-mirror/vegawallet-mainnet-mirror.toml +NX_VEGA_URL=https://api.mainnet-mirror.vega.rocks/graphql +NX_VEGA_NETWORKS='{"DEVNET":"https://dev.governance.vega.xyz","TESTNET":"https://governance.fairground.wtf","MAINNET":"https://governance.vega.xyz","MAINNET-MIRROR":"https://governance.mainnet-mirror.vega.rocks","STAGNET1":"https://trading.stagnet1.vega.rocks"}' +NX_ETHEREUM_PROVIDER_URL=https://sepolia.infura.io/v3/4f846e79e13f44d1b51bbd7ed9edefb8 +NX_ETHERSCAN_URL=https://sepolia.etherscan.io +NX_GITHUB_FEEDBACK_URL=https://github.com/vegaprotocol/feedback/discussions +NX_SENTRY_DSN=https://4b8c8a8ba07742648aa4dfe1b8d17e40@o286262.ingest.sentry.io/5882996 +NX_VEGA_EXPLORER_URL=https://explorer.mainnet-mirror.vega.rocks +NX_VEGA_DOCS_URL=https://docs.vega.xyz/mainnet +NX_DELEGATIONS_PAGINATION=50 +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_VEGA_REST_URL=https://api.mainnet-mirror.vega.rocks/api/v2/ diff --git a/apps/governance/README.md b/apps/governance/README.md index 5eab1fd42..f42175f6b 100644 --- a/apps/governance/README.md +++ b/apps/governance/README.md @@ -25,6 +25,7 @@ yarn nx serve governance Example configurations are provided here: - [Mainnet](./.env.mainnet) +- [Mainnet-mirror](./.env.mainnet-mirror) - [Devnet](./.env.devnet) - [Testnet](./.env.testnet) diff --git a/apps/governance/src/routes/proposals/proposal/Proposal.graphql b/apps/governance/src/routes/proposals/proposal/Proposal.graphql index 5b3fe0741..0185dfaeb 100644 --- a/apps/governance/src/routes/proposals/proposal/Proposal.graphql +++ b/apps/governance/src/routes/proposals/proposal/Proposal.graphql @@ -91,46 +91,46 @@ query Proposal($proposalId: ID!) { } } } - dataSourceSpecForTradingTermination { - sourceType { - ... on DataSourceDefinitionInternal { - sourceType { - ... on DataSourceSpecConfigurationTime { - conditions { - operator - value - } - } - } - } - ... on DataSourceDefinitionExternal { - sourceType { - ... on DataSourceSpecConfiguration { - signers { - signer { - ... on PubKey { - key - } - ... on ETHAddress { - address - } - } - } - filters { - key { - name - type - } - conditions { - operator - value - } - } - } - } - } - } - } + # dataSourceSpecForTradingTermination { + # sourceType { + # ... on DataSourceDefinitionInternal { + # sourceType { + # ... on DataSourceSpecConfigurationTime { + # conditions { + # operator + # value + # } + # } + # } + # } + # ... on DataSourceDefinitionExternal { + # sourceType { + # ... on DataSourceSpecConfiguration { + # signers { + # signer { + # ... on PubKey { + # key + # } + # ... on ETHAddress { + # address + # } + # } + # } + # filters { + # key { + # name + # type + # } + # conditions { + # operator + # value + # } + # } + # } + # } + # } + # } + # } dataSourceSpecBinding { settlementDataProperty tradingTerminationProperty @@ -203,46 +203,46 @@ query Proposal($proposalId: ID!) { } } } - dataSourceSpecForTradingTermination { - sourceType { - ... on DataSourceDefinitionInternal { - sourceType { - ... on DataSourceSpecConfigurationTime { - conditions { - operator - value - } - } - } - } - ... on DataSourceDefinitionExternal { - sourceType { - ... on DataSourceSpecConfiguration { - signers { - signer { - ... on PubKey { - key - } - ... on ETHAddress { - address - } - } - } - filters { - key { - name - type - } - conditions { - operator - value - } - } - } - } - } - } - } + # dataSourceSpecForTradingTermination { + # sourceType { + # ... on DataSourceDefinitionInternal { + # sourceType { + # ... on DataSourceSpecConfigurationTime { + # conditions { + # operator + # value + # } + # } + # } + # } + # ... on DataSourceDefinitionExternal { + # sourceType { + # ... on DataSourceSpecConfiguration { + # signers { + # signer { + # ... on PubKey { + # key + # } + # ... on ETHAddress { + # address + # } + # } + # } + # filters { + # key { + # name + # type + # } + # conditions { + # operator + # value + # } + # } + # } + # } + # } + # } + # } dataSourceSpecBinding { settlementDataProperty tradingTerminationProperty diff --git a/apps/governance/src/routes/proposals/proposal/__generated__/Proposal.ts b/apps/governance/src/routes/proposals/proposal/__generated__/Proposal.ts index 31b7a5f64..2674364a2 100644 --- a/apps/governance/src/routes/proposals/proposal/__generated__/Proposal.ts +++ b/apps/governance/src/routes/proposals/proposal/__generated__/Proposal.ts @@ -8,7 +8,7 @@ export type ProposalQueryVariables = Types.Exact<{ }>; -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, lpPriceRange: string, 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?: 'DataSourceDefinitionInternal', sourceType: { __typename?: 'DataSourceSpecConfigurationTime', conditions: Array<{ __typename?: 'Condition', operator: Types.ConditionOperator, value?: string | null } | null> } } }, dataSourceSpecForTradingTermination: { __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?: 'DataSourceDefinitionInternal', sourceType: { __typename?: 'DataSourceSpecConfigurationTime', conditions: Array<{ __typename?: 'Condition', operator: Types.ConditionOperator, value?: string | null } | null> } } }, 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?: '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?: 'DataSourceDefinitionInternal', sourceType: { __typename?: 'DataSourceSpecConfigurationTime', conditions: Array<{ __typename?: 'Condition', operator: Types.ConditionOperator, value?: string | null } | null> } } }, dataSourceSpecForTradingTermination: { __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?: 'DataSourceDefinitionInternal', sourceType: { __typename?: 'DataSourceSpecConfigurationTime', conditions: Array<{ __typename?: 'Condition', operator: Types.ConditionOperator, value?: string | null } | null> } } }, dataSourceSpecBinding: { __typename?: 'DataSourceSpecToFutureBinding', settlementDataProperty: string, tradingTerminationProperty: 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?: 'UpdateNetworkParameter', networkParameter: { __typename?: 'NetworkParameter', key: string, value: string } } }, 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?: '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, lpPriceRange: string, 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?: 'DataSourceDefinitionInternal', sourceType: { __typename?: 'DataSourceSpecConfigurationTime', conditions: Array<{ __typename?: 'Condition', operator: Types.ConditionOperator, value?: string | null } | null> } } }, 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?: '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?: 'DataSourceDefinitionInternal', sourceType: { __typename?: 'DataSourceSpecConfigurationTime', conditions: Array<{ __typename?: 'Condition', operator: Types.ConditionOperator, value?: string | null } | null> } } }, dataSourceSpecBinding: { __typename?: 'DataSourceSpecToFutureBinding', settlementDataProperty: string, tradingTerminationProperty: 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?: 'UpdateNetworkParameter', networkParameter: { __typename?: 'NetworkParameter', key: string, value: string } } }, votes: { __typename?: 'ProposalVotes', yes: { __typename?: 'ProposalVoteSide', totalTokens: string, totalNumber: string, totalEquityLikeShareWeight: string }, no: { __typename?: 'ProposalVoteSide', totalTokens: string, totalNumber: string, totalEquityLikeShareWeight: string } } } | null }; export const ProposalDocument = gql` @@ -104,46 +104,6 @@ export const ProposalDocument = gql` } } } - dataSourceSpecForTradingTermination { - sourceType { - ... on DataSourceDefinitionInternal { - sourceType { - ... on DataSourceSpecConfigurationTime { - conditions { - operator - value - } - } - } - } - ... on DataSourceDefinitionExternal { - sourceType { - ... on DataSourceSpecConfiguration { - signers { - signer { - ... on PubKey { - key - } - ... on ETHAddress { - address - } - } - } - filters { - key { - name - type - } - conditions { - operator - value - } - } - } - } - } - } - } dataSourceSpecBinding { settlementDataProperty tradingTerminationProperty @@ -216,46 +176,6 @@ export const ProposalDocument = gql` } } } - dataSourceSpecForTradingTermination { - sourceType { - ... on DataSourceDefinitionInternal { - sourceType { - ... on DataSourceSpecConfigurationTime { - conditions { - operator - value - } - } - } - } - ... on DataSourceDefinitionExternal { - sourceType { - ... on DataSourceSpecConfiguration { - signers { - signer { - ... on PubKey { - key - } - ... on ETHAddress { - address - } - } - } - filters { - key { - name - type - } - conditions { - operator - value - } - } - } - } - } - } - } dataSourceSpecBinding { settlementDataProperty tradingTerminationProperty @@ -374,4 +294,4 @@ export function useProposalLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions

; export type ProposalLazyQueryHookResult = ReturnType; -export type ProposalQueryResult = Apollo.QueryResult; \ No newline at end of file +export type ProposalQueryResult = Apollo.QueryResult; diff --git a/apps/trading-e2e/src/integration/market-all.cy.ts b/apps/trading-e2e/src/integration/market-all.cy.ts index 9846942a1..95c78d497 100644 --- a/apps/trading-e2e/src/integration/market-all.cy.ts +++ b/apps/trading-e2e/src/integration/market-all.cy.ts @@ -153,7 +153,7 @@ describe('markets all table', { tags: '@smoke' }, () => { cy.get(dropdownContent) .find(dropdownContentItem) .eq(2) - .should('have.text', 'View asset'); + .should('have.text', 'View settlement asset details'); cy.getByTestId('market-actions-content').click(); }); diff --git a/apps/trading/.env.mainnet-mirror b/apps/trading/.env.mainnet-mirror new file mode 100644 index 000000000..cb92b542d --- /dev/null +++ b/apps/trading/.env.mainnet-mirror @@ -0,0 +1,17 @@ +NX_ETHEREUM_PROVIDER_URL=https://sepolia.infura.io/v3/4f846e79e13f44d1b51bbd7ed9edefb8 +NX_ETHERSCAN_URL=https://sepolia.etherscan.io +NX_GITHUB_FEEDBACK_URL=https://github.com/vegaprotocol/feedback/discussions +NX_SENTRY_DSN=https://2ffce43721964aafa78277c50654ece4@o286262.ingest.sentry.io/6300613 +NX_VEGA_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/networks-internal/main/mainnet-mirror/vegawallet-mainnet-mirror.toml +NX_VEGA_ENV=MAINNET-MIRROR +NX_VEGA_EXPLORER_URL=https://explorer.mainnet-mirror.vega.rocks +NX_VEGA_NETWORKS={\"MAINNET\":\"https://console.vega.xyz\",\"TESTNET\":\"https://console.fairground.wtf\",\"STAGNET1\":\"https://trading.stagnet1.vega.rocks\",\"MAINNET-MIRROR\":\"https://trading.mainnet-mirror.vega.rocks\"} +NX_VEGA_TOKEN_URL=https://governance.mainnet-mirror.vega.rocks +NX_VEGA_WALLET_URL=http://localhost:1789 +NX_VEGA_DOCS_URL=https://docs.vega.xyz/mainnet +NX_VEGA_REPO_URL=https://github.com/vegaprotocol/vega/releases +NX_ANNOUNCEMENTS_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/announcements/mainnet/announcements.json +NX_VEGA_INCIDENT_URL=https://blog.vega.xyz/tagged/vega-incident-reports +NX_VEGA_CONSOLE_URL=https://console.mainnet-mirror.vega.rocks +# TAG name of the current app version - TODO: bump to the latest upon release +NX_APP_VERSION=v0.20.19-core-0.71.6 diff --git a/apps/trading/README.md b/apps/trading/README.md index 74ecdfa2c..12f3267f4 100644 --- a/apps/trading/README.md +++ b/apps/trading/README.md @@ -19,6 +19,7 @@ yarn nx serve explorer Example configurations are provided here: - [Mainnet](./.env.mainnet) +- [Mainnet-mirror](./.env.mainnet-mirror) - [Devnet](./.env.devnet) - [Testnet](./.env.testnet) diff --git a/apps/trading/client-pages/market/trade-grid.tsx b/apps/trading/client-pages/market/trade-grid.tsx index e035bd204..8c70fb78b 100644 --- a/apps/trading/client-pages/market/trade-grid.tsx +++ b/apps/trading/client-pages/market/trade-grid.tsx @@ -9,10 +9,7 @@ import { t } from '@vegaprotocol/i18n'; import { OracleBanner } from '@vegaprotocol/markets'; import type { Market } from '@vegaprotocol/markets'; import { Filter } from '@vegaprotocol/orders'; -import { - usePaneLayout, - useScreenDimensions, -} from '@vegaprotocol/react-helpers'; +import { useScreenDimensions } from '@vegaprotocol/react-helpers'; import { Tab, LocalStoragePersistTabs as Tabs, @@ -25,6 +22,7 @@ import { HeaderTitle } from '../../components/header'; import { ResizableGrid, ResizableGridPanel, + usePaneLayout, } from '../../components/resizable-grid'; import { TradingViews } from './trade-views'; import { MarketSelector } from './market-selector'; diff --git a/apps/trading/client-pages/markets/closed.tsx b/apps/trading/client-pages/markets/closed.tsx index 4908135c9..8c0083046 100644 --- a/apps/trading/client-pages/markets/closed.tsx +++ b/apps/trading/client-pages/markets/closed.tsx @@ -18,7 +18,7 @@ import type { MarketMaybeWithData, } from '@vegaprotocol/markets'; import { - MarketTableActions, + MarketActionsDropdown, closedMarketsWithDataProvider, } from '@vegaprotocol/markets'; import { useVegaWallet } from '@vegaprotocol/wallet'; @@ -291,7 +291,7 @@ const ClosedMarketsDataGrid = ({ cellRenderer: ({ data }: VegaICellRendererParams) => { if (!data) return null; return ( - diff --git a/apps/trading/client-pages/portfolio/account-history-container.tsx b/apps/trading/client-pages/portfolio/account-history-container.tsx index f4bd1eeb6..6a2482c44 100644 --- a/apps/trading/client-pages/portfolio/account-history-container.tsx +++ b/apps/trading/client-pages/portfolio/account-history-container.tsx @@ -24,7 +24,10 @@ import { PriceChart } from 'pennant'; import 'pennant/dist/style.css'; import type { Account } from '@vegaprotocol/accounts'; import { accountsDataProvider } from '@vegaprotocol/accounts'; -import { useThemeSwitcher } from '@vegaprotocol/react-helpers'; +import { + useLocalStorageSnapshot, + useThemeSwitcher, +} from '@vegaprotocol/react-helpers'; import { useDataProvider } from '@vegaprotocol/data-provider'; import type { Market } from '@vegaprotocol/markets'; @@ -68,7 +71,7 @@ export const AccountHistoryContainer = () => { const { data: assets } = useAssetsDataProvider(); if (!pubKey) { - return Connect wallet; + return {t('Connect wallet')}; } return ( @@ -114,7 +117,15 @@ const AccountHistoryManager = ({ .sort((a, b) => a.name.localeCompare(b.name)), [assetData, assetIds] ); - const [asset, setAsset] = useState(assets[0]); + const [assetId, setAssetId] = useLocalStorageSnapshot( + 'account-history-active-asset-id' + ); + + const asset = useMemo( + () => assets.find((a) => a.id === assetId) || assets[0], + [assetId, assets] + ); + const [range, setRange] = useState( DateRange.RANGE_1M ); @@ -146,10 +157,10 @@ const AccountHistoryManager = ({ m.tradableInstrument.instrument.product.settlementAsset.id; const newAsset = assets.find((item) => item.id === newAssetId); if ((!asset || (assets && newAssetId !== asset.id)) && newAsset) { - setAsset(newAsset); + setAssetId(newAsset.id); } }, - [asset, assets] + [asset, assets, setAssetId] ); const variables = useMemo( @@ -211,14 +222,14 @@ const AccountHistoryManager = ({ > {assets.map((a) => ( - setAsset(a)}> + setAssetId(a.id)}> {a.symbol} ))} ); - }, [assets, asset]); + }, [asset, assets, setAssetId]); const marketsMenu = useMemo(() => { return accountType === Schema.AccountType.ACCOUNT_TYPE_MARGIN && markets?.length ? ( diff --git a/apps/trading/client-pages/portfolio/portfolio.tsx b/apps/trading/client-pages/portfolio/portfolio.tsx index 009e4492f..4c4c8d4fd 100644 --- a/apps/trading/client-pages/portfolio/portfolio.tsx +++ b/apps/trading/client-pages/portfolio/portfolio.tsx @@ -4,7 +4,6 @@ import { LayoutPriority } from 'allotment'; import { titlefy } from '@vegaprotocol/utils'; import { t } from '@vegaprotocol/i18n'; import { useIncompleteWithdrawals } from '@vegaprotocol/withdraws'; -import { usePaneLayout } from '@vegaprotocol/react-helpers'; import { Tab, LocalStoragePersistTabs as Tabs } from '@vegaprotocol/ui-toolkit'; import { usePageTitleStore } from '../../stores'; import { useMarketClickHandler } from '../../lib/hooks/use-market-click-handler'; @@ -20,6 +19,7 @@ import { AccountHistoryContainer } from './account-history-container'; import { ResizableGrid, ResizableGridPanel, + usePaneLayout, } from '../../components/resizable-grid'; const WithdrawalsIndicator = () => { diff --git a/apps/trading/components/resizable-grid/index.ts b/apps/trading/components/resizable-grid/index.ts index b33c20448..d3d569dad 100644 --- a/apps/trading/components/resizable-grid/index.ts +++ b/apps/trading/components/resizable-grid/index.ts @@ -1 +1,2 @@ export * from './resizable-grid'; +export * from './use-pane-layout'; diff --git a/libs/react-helpers/src/hooks/use-pane-layout.spec.ts b/apps/trading/components/resizable-grid/use-pane-layout.spec.ts similarity index 100% rename from libs/react-helpers/src/hooks/use-pane-layout.spec.ts rename to apps/trading/components/resizable-grid/use-pane-layout.spec.ts diff --git a/libs/react-helpers/src/hooks/use-pane-layout.ts b/apps/trading/components/resizable-grid/use-pane-layout.ts similarity index 100% rename from libs/react-helpers/src/hooks/use-pane-layout.ts rename to apps/trading/components/resizable-grid/use-pane-layout.ts diff --git a/libs/accounts/src/lib/accounts-actions-dropdown.tsx b/libs/accounts/src/lib/accounts-actions-dropdown.tsx index bf8ce77f8..97dc9e502 100644 --- a/libs/accounts/src/lib/accounts-actions-dropdown.tsx +++ b/libs/accounts/src/lib/accounts-actions-dropdown.tsx @@ -1,11 +1,9 @@ import { ETHERSCAN_ADDRESS, useEtherscanLink } from '@vegaprotocol/environment'; import { t } from '@vegaprotocol/i18n'; import { - DropdownMenu, - DropdownMenuContent, + ActionsDropdown, DropdownMenuCopyItem, DropdownMenuItem, - DropdownMenuTrigger, Link, VegaIcon, VegaIconNames, @@ -29,75 +27,65 @@ export const AccountsActionsDropdown = ({ const etherscanLink = useEtherscanLink(); const openTransferDialog = useTransferDialog((store) => store.open); const openAssetDialog = useAssetDetailsDialogStore((store) => store.open); + return ( - - - - } - > - - - - {t('Deposit')} + + + + {t('Deposit')} + + + + {t('Withdraw')} + + openTransferDialog(true, assetId)} + > + + {t('Transfer')} + + + + {t('View usage breakdown')} + + { + openAssetDialog(assetId, e.target as HTMLElement); + }} + > + + {t('View asset details')} + + + {assetContractAddress && ( + + + + + {t('View on Etherscan')} + + - - - {t('Withdraw')} - - openTransferDialog(true, assetId)} - > - - {t('Transfer')} - - - - {t('Breakdown')} - - { - openAssetDialog(assetId, e.target as HTMLElement); - }} - > - - {t('View asset')} - - - {assetContractAddress && ( - - - - - {t('View on Etherscan')} - - - - )} - - + )} + ); }; diff --git a/libs/accounts/src/lib/transfer-container.tsx b/libs/accounts/src/lib/transfer-container.tsx index 338ffec79..cea902cf2 100644 --- a/libs/accounts/src/lib/transfer-container.tsx +++ b/libs/accounts/src/lib/transfer-container.tsx @@ -13,6 +13,7 @@ import { accountsDataProvider } from './accounts-data-provider'; import { TransferForm } from './transfer-form'; import { useTransferDialog } from './transfer-dialog'; import { Lozenge } from '@vegaprotocol/ui-toolkit'; +import sortBy from 'lodash/sortBy'; export const TransferContainer = ({ assetId }: { assetId?: string }) => { const { pubKey, pubKeys } = useVegaWallet(); @@ -58,7 +59,7 @@ export const TransferContainer = ({ assetId }: { assetId?: string }) => { pk.publicKey) : null} - assets={assets} + assets={sortBy(assets, 'name')} assetId={assetId} feeFactor={param} submitTransfer={transfer} diff --git a/libs/accounts/src/lib/transfer-form.spec.tsx b/libs/accounts/src/lib/transfer-form.spec.tsx index 131c51fee..6ffc0c1ea 100644 --- a/libs/accounts/src/lib/transfer-form.spec.tsx +++ b/libs/accounts/src/lib/transfer-form.spec.tsx @@ -8,7 +8,7 @@ import { import BigNumber from 'bignumber.js'; import { AddressField, TransferFee, TransferForm } from './transfer-form'; import { AccountType } from '@vegaprotocol/types'; -import { formatNumber, removeDecimal } from '@vegaprotocol/utils'; +import { addDecimal, formatNumber, removeDecimal } from '@vegaprotocol/utils'; describe('TransferForm', () => { const submit = () => fireEvent.submit(screen.getByTestId('transfer-form')); @@ -16,11 +16,11 @@ describe('TransferForm', () => { const pubKey = '70d14a321e02e71992fd115563df765000ccc4775cbe71a0e2f9ff5a3b9dc680'; const asset = { - id: 'asset-0', - symbol: 'ASSET 0', - name: 'Asset 0', + id: 'eur', + symbol: '€', + name: 'EUR', decimals: 2, - balance: '1000', + balance: addDecimal(100000, 2), // 1000 }; const props = { pubKey, @@ -92,7 +92,7 @@ describe('TransferForm', () => { expect(await screen.findByTestId('select-asset')).toHaveTextContent( asset.name ); - expect(screen.getByTestId('asset-balance')).toHaveTextContent( + expect(await screen.findByTestId('asset-balance')).toHaveTextContent( formatNumber(asset.balance, asset.decimals) ); @@ -168,7 +168,7 @@ describe('TransferForm', () => { expect(await screen.findByTestId('select-asset')).toHaveTextContent( asset.name ); - expect(screen.getByTestId('asset-balance')).toHaveTextContent( + expect(await screen.findByTestId('asset-balance')).toHaveTextContent( formatNumber(asset.balance, asset.decimals) ); @@ -244,7 +244,7 @@ describe('TransferForm', () => { expect(await screen.findByTestId('select-asset')).toHaveTextContent( asset.name ); - expect(screen.getByTestId('asset-balance')).toHaveTextContent( + expect(await screen.findByTestId('asset-balance')).toHaveTextContent( formatNumber(asset.balance, asset.decimals) ); diff --git a/libs/accounts/src/lib/transfer-form.tsx b/libs/accounts/src/lib/transfer-form.tsx index 5de6822a2..1c426e1bf 100644 --- a/libs/accounts/src/lib/transfer-form.tsx +++ b/libs/accounts/src/lib/transfer-form.tsx @@ -12,7 +12,6 @@ import { FormGroup, Input, InputError, - Option, RichSelect, Select, Tooltip, @@ -24,6 +23,7 @@ import BigNumber from 'bignumber.js'; import type { ReactNode } from 'react'; import { useCallback, useMemo, useState } from 'react'; import { Controller, useForm } from 'react-hook-form'; +import { AssetOption, Balance } from '@vegaprotocol/assets'; interface FormFields { toAddress: string; @@ -193,21 +193,20 @@ export const TransferForm = ({ onValueChange={(value) => { field.onChange(value); }} - placeholder={t('Please select')} + placeholder={t('Please select an asset')} value={field.value} > {assets.map((a) => ( -

-
{a.name}
-
- - {formatNumber(a.balance, a.decimals)} - {' '} - {a.symbol} -
-
- + + } + /> ))} )} diff --git a/libs/announcements/src/lib/announcements.tsx b/libs/announcements/src/lib/announcements.tsx index bdde69baf..8e56d6cf2 100644 --- a/libs/announcements/src/lib/announcements.tsx +++ b/libs/announcements/src/lib/announcements.tsx @@ -1,6 +1,9 @@ import { useEffect, useState } from 'react'; import type { AppNameType, Announcement } from './schema'; -import { useAnnouncement } from './hooks/use-announcement'; +import { + useAnnouncement, + useDismissedAnnouncement, +} from './hooks/use-announcement'; import { AnnouncementBanner as Banner, ExternalLink, @@ -36,6 +39,7 @@ export const AnnouncementBanner = ({ }: AnnouncementBannerProps) => { const [isVisible, setVisible] = useState(false); const { data, reload } = useAnnouncement(app, configUrl); + const [, setDismissed] = useDismissedAnnouncement(); useEffect(() => { const now = new Date(); @@ -88,7 +92,10 @@ export const AnnouncementBanner = ({ diff --git a/libs/announcements/src/lib/hooks/use-announcement.ts b/libs/announcements/src/lib/hooks/use-announcement.ts index 931946f22..4b8377514 100644 --- a/libs/announcements/src/lib/hooks/use-announcement.ts +++ b/libs/announcements/src/lib/hooks/use-announcement.ts @@ -1,6 +1,8 @@ import { useCallback, useEffect, useState } from 'react'; import type { AppNameType, Announcement } from '../schema'; import { AnnouncementsSchema } from '../schema'; +import { sha256 } from 'ethers/lib/utils'; +import { useLocalStorageSnapshot } from '@vegaprotocol/react-helpers'; const getData = async (name: AppNameType, url: string) => { const now = new Date(); @@ -31,6 +33,22 @@ type State = { error: null | string; }; +const checksum = (data: object) => sha256(Buffer.from(JSON.stringify(data))); + +export const useDismissedAnnouncement = (): [ + string | null | undefined, + (data: object) => void +] => { + const [dismissed, setDismissedInStorage] = useLocalStorageSnapshot( + 'dismissed-announcement' + ); + const setDismissed = useCallback( + (data: object) => setDismissedInStorage(checksum(data)), + [setDismissedInStorage] + ); + return [dismissed, setDismissed]; +}; + export const useAnnouncement = (name: AppNameType, url: string) => { const [state, setState] = useState({ loading: true, @@ -38,12 +56,14 @@ export const useAnnouncement = (name: AppNameType, url: string) => { error: null, }); + const [dismissed] = useDismissedAnnouncement(); + const fetchData = useCallback(() => { let mounted = true; getData(name, url) .then((data) => { - if (mounted) { + if (mounted && dismissed !== checksum(data)) { setState({ loading: false, data, @@ -64,7 +84,7 @@ export const useAnnouncement = (name: AppNameType, url: string) => { return () => { mounted = false; }; - }, [name, url, setState]); + }, [name, url, dismissed]); useEffect(() => { fetchData(); diff --git a/libs/assets/src/lib/asset-option.tsx b/libs/assets/src/lib/asset-option.tsx index 2d67c79a8..1a7a98135 100644 --- a/libs/assets/src/lib/asset-option.tsx +++ b/libs/assets/src/lib/asset-option.tsx @@ -5,7 +5,7 @@ import { t } from '@vegaprotocol/i18n'; import type { ReactNode } from 'react'; type AssetOptionProps = { - asset: AssetFieldsFragment; + asset: Pick; balance?: ReactNode; }; @@ -17,11 +17,13 @@ export const Balance = ({ symbol: string; }) => balance ? ( -
+
{balance} {symbol}
) : ( -
{t('Fetching balance…')}
+
+ {t('Fetching balance…')} +
); export const AssetOption = ({ asset, balance }: AssetOptionProps) => { diff --git a/libs/deal-ticket/src/components/deal-ticket/deal-ticket.spec.tsx b/libs/deal-ticket/src/components/deal-ticket/deal-ticket.spec.tsx index 89c0b6c00..0c91e4592 100644 --- a/libs/deal-ticket/src/components/deal-ticket/deal-ticket.spec.tsx +++ b/libs/deal-ticket/src/components/deal-ticket/deal-ticket.spec.tsx @@ -1,13 +1,13 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ import { VegaWalletContext } from '@vegaprotocol/wallet'; -import { act, render, screen } from '@testing-library/react'; +import { act, render, renderHook, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import { generateMarket, generateMarketData } from '../../test-helpers'; import { DealTicket } from './deal-ticket'; import * as Schema from '@vegaprotocol/types'; import { MockedProvider } from '@apollo/client/testing'; import { addDecimal } from '@vegaprotocol/utils'; -import { useOrderStore } from '@vegaprotocol/orders'; +import { useCreateOrderStore } from '@vegaprotocol/orders'; jest.mock('zustand'); jest.mock('./deal-ticket-fee-details', () => ({ @@ -30,6 +30,9 @@ function generateJsx() { } describe('DealTicket', () => { + const { result } = renderHook(() => useCreateOrderStore()); + const useOrderStore = result.current; + beforeEach(() => { localStorage.clear(); }); @@ -138,7 +141,6 @@ describe('DealTicket', () => { reduceOnly: true, postOnly: false, }; - useOrderStore.setState({ orders: { [expectedOrder.marketId]: expectedOrder, diff --git a/libs/deal-ticket/src/hooks/use-order-form.spec.ts b/libs/deal-ticket/src/hooks/use-order-form.spec.ts index 093146c05..230657935 100644 --- a/libs/deal-ticket/src/hooks/use-order-form.spec.ts +++ b/libs/deal-ticket/src/hooks/use-order-form.spec.ts @@ -1,6 +1,6 @@ import omit from 'lodash/omit'; import { act, renderHook } from '@testing-library/react'; -import { getDefaultOrder, useOrderStore } from '@vegaprotocol/orders'; +import { getDefaultOrder, useCreateOrderStore } from '@vegaprotocol/orders'; import { useOrderForm } from './use-order-form'; jest.mock('zustand'); @@ -10,6 +10,8 @@ describe('useOrderForm', () => { const setup = (marketId: string) => { return renderHook(() => useOrderForm(marketId)); }; + const { result } = renderHook(() => useCreateOrderStore()); + const useOrderStore = result.current; it('updates form fields when the order changes', async () => { const order = getDefaultOrder(marketId); diff --git a/libs/fills/src/lib/fill-actions-dropdown.tsx b/libs/fills/src/lib/fill-actions-dropdown.tsx index ebfe774f9..97c7b4d5e 100644 --- a/libs/fills/src/lib/fill-actions-dropdown.tsx +++ b/libs/fills/src/lib/fill-actions-dropdown.tsx @@ -1,10 +1,6 @@ import { - DropdownMenu, - DropdownMenuContent, + ActionsDropdown, DropdownMenuCopyItem, - DropdownMenuTrigger, - VegaIcon, - VegaIconNames, } from '@vegaprotocol/ui-toolkit'; import { t } from '@vegaprotocol/i18n'; @@ -18,27 +14,13 @@ export const FillActionsDropdown = ({ sellOrderId: string; }) => { return ( - - - - } - > - - - - - - + + + + + ); }; diff --git a/libs/market-depth/src/lib/orderbook-manager.tsx b/libs/market-depth/src/lib/orderbook-manager.tsx index 8a9c73e95..78281a21c 100644 --- a/libs/market-depth/src/lib/orderbook-manager.tsx +++ b/libs/market-depth/src/lib/orderbook-manager.tsx @@ -9,7 +9,7 @@ import type { MarketDepthUpdateSubscription, PriceLevelFieldsFragment, } from './__generated__/MarketDepth'; -import { useOrderStore } from '@vegaprotocol/orders'; +import { useCreateOrderStore } from '@vegaprotocol/orders'; export type OrderbookData = { asks: PriceLevelFieldsFragment[]; @@ -50,8 +50,8 @@ export const OrderbookManager = ({ marketId }: OrderbookManagerProps) => { dataProvider: marketDataProvider, variables, }); - - const updateOrder = useOrderStore((store) => store.update); + const useOrderStoreRef = useCreateOrderStore(); + const updateOrder = useOrderStoreRef((store) => store.update); return ( { const open = useAssetDetailsDialogStore((store) => store.open); const linkCreator = useLinks(DApp.Explorer); + return ( - + + + - - - } - > - - - - - - - {t('View on Explorer')} - - - - { - open(assetId, e.target as HTMLElement); - }} - > - - {t('View asset')} - - - + + + {t('View on Explorer')} + + + + { + open(assetId, e.target as HTMLElement); + }} + > + + {t('View settlement asset details')} + + ); }; diff --git a/libs/markets/src/lib/components/markets-container/use-column-defs.tsx b/libs/markets/src/lib/components/markets-container/use-column-defs.tsx index 669856a7f..0c032b5c2 100644 --- a/libs/markets/src/lib/components/markets-container/use-column-defs.tsx +++ b/libs/markets/src/lib/components/markets-container/use-column-defs.tsx @@ -12,7 +12,7 @@ import { addDecimalsFormatNumber, toBigNum } from '@vegaprotocol/utils'; import { ButtonLink } from '@vegaprotocol/ui-toolkit'; import { useAssetDetailsDialogStore } from '@vegaprotocol/assets'; import type { MarketMaybeWithData } from '../../markets-provider'; -import { MarketTableActions } from './market-table-actions'; +import { MarketActionsDropdown } from './market-table-actions'; interface Props { onMarketClick: (marketId: string, metaKey?: boolean) => void; @@ -172,7 +172,7 @@ export const useColumnDefs = ({ onMarketClick }: Props) => { }: VegaICellRendererParams) => { if (!data) return null; return ( - { return ( - - - - } - > - - - - + + + ); }; diff --git a/libs/orders/src/lib/order-hooks/use-order-store.spec.ts b/libs/orders/src/lib/order-hooks/use-order-store.spec.ts index 9a7fb8674..71a4334b3 100644 --- a/libs/orders/src/lib/order-hooks/use-order-store.spec.ts +++ b/libs/orders/src/lib/order-hooks/use-order-store.spec.ts @@ -2,16 +2,17 @@ import { getDefaultOrder, STORAGE_KEY, useOrder, - useOrderStore, + useCreateOrderStore, } from './use-order-store'; import { act, renderHook } from '@testing-library/react'; import { OrderType } from '@vegaprotocol/types'; jest.mock('zustand'); -describe('useOrderStore', () => { +describe('useCreateOrderStore', () => { const setup = () => { - return renderHook(() => useOrderStore()); + const { result } = renderHook(() => useCreateOrderStore()); + return renderHook(() => result.current()); }; afterEach(() => { diff --git a/libs/orders/src/lib/order-hooks/use-order-store.ts b/libs/orders/src/lib/order-hooks/use-order-store.ts index b7793dc43..7f5a20d01 100644 --- a/libs/orders/src/lib/order-hooks/use-order-store.ts +++ b/libs/orders/src/lib/order-hooks/use-order-store.ts @@ -1,6 +1,7 @@ import { OrderTimeInForce, Side } from '@vegaprotocol/types'; import { OrderType } from '@vegaprotocol/types'; -import { useCallback, useEffect } from 'react'; +import { useCallback, useEffect, useRef } from 'react'; +import type { StateCreator, UseBoundStore, Mutate, StoreApi } from 'zustand'; import { create } from 'zustand'; import { persist, subscribeWithSelector } from 'zustand/middleware'; @@ -31,58 +32,69 @@ interface Store { export const STORAGE_KEY = 'vega_order_store'; -export const useOrderStore = create()( - persist( - subscribeWithSelector((set) => ({ - orders: {}, - update: (marketId, order, persist = true) => { - set((state) => { - const curr = state.orders[marketId]; - const defaultOrder = getDefaultOrder(marketId); +const orderStateCreator: StateCreator = (set) => ({ + orders: {}, + update: (marketId, order, persist = true) => { + set((state) => { + const curr = state.orders[marketId]; + const defaultOrder = getDefaultOrder(marketId); + + return { + orders: { + ...state.orders, + [marketId]: { + ...defaultOrder, + ...curr, + ...order, + persist, + }, + }, + }; + }); + }, +}); + +let store: UseBoundStore, []>> | null = null; +const getOrderStore = () => { + if (!store) { + store = create()( + persist(subscribeWithSelector(orderStateCreator), { + name: STORAGE_KEY, + partialize: (state) => { + // only store the order in localStorage if user has edited, this avoids + // bloating localStorage if a user just visits the page but does not + // edit the ticket + const partializedOrders: OrderMap = {}; + for (const o in state.orders) { + const order = state.orders[o]; + if (order && order.persist) { + partializedOrders[order.marketId] = order; + } + } return { - orders: { - ...state.orders, - [marketId]: { - ...defaultOrder, - ...curr, - ...order, - persist, - }, - }, + ...state, + orders: partializedOrders, }; - }); - }, - })), - { - name: STORAGE_KEY, - partialize: (state) => { - // only store the order in localStorage if user has edited, this avoids - // bloating localStorage if a user just visits the page but does not - // edit the ticket - const partializedOrders: OrderMap = {}; - for (const o in state.orders) { - const order = state.orders[o]; - if (order && order.persist) { - partializedOrders[order.marketId] = order; - } - } + }, + }) + ); + } + return store as UseBoundStore, []>>; +}; - return { - ...state, - orders: partializedOrders, - }; - }, - } - ) -); +export const useCreateOrderStore = () => { + const useOrderStoreRef = useRef(getOrderStore()); + return useOrderStoreRef.current; +}; /** * Retrieves an order from the store for a market and * creates one if it doesn't already exist */ export const useOrder = (marketId: string) => { - const [order, _update] = useOrderStore((store) => { + const useOrderStoreRef = useCreateOrderStore(); + const [order, _update] = useOrderStoreRef((store) => { return [store.orders[marketId], store.update]; }); diff --git a/libs/positions/src/lib/position-actions-dropdown.tsx b/libs/positions/src/lib/position-actions-dropdown.tsx index 64250def0..f9740d5c9 100644 --- a/libs/positions/src/lib/position-actions-dropdown.tsx +++ b/libs/positions/src/lib/position-actions-dropdown.tsx @@ -1,37 +1,25 @@ import { t } from '@vegaprotocol/i18n'; import { - DropdownMenu, - DropdownMenuContent, + ActionsDropdown, DropdownMenuItem, - DropdownMenuTrigger, VegaIcon, VegaIconNames, } from '@vegaprotocol/ui-toolkit'; import { useAssetDetailsDialogStore } from '@vegaprotocol/assets'; -export const PositionTableActions = ({ assetId }: { assetId: string }) => { +export const PositionActionsDropdown = ({ assetId }: { assetId: string }) => { const open = useAssetDetailsDialogStore((store) => store.open); + return ( - - - - } - > - - { - open(assetId, e.target as HTMLElement); - }} - > - - {t('View asset')} - - - + + { + open(assetId, e.target as HTMLElement); + }} + > + + {t('View settlement asset details')} + + ); }; diff --git a/libs/positions/src/lib/positions-table.tsx b/libs/positions/src/lib/positions-table.tsx index bdcf6902c..9ce48d269 100644 --- a/libs/positions/src/lib/positions-table.tsx +++ b/libs/positions/src/lib/positions-table.tsx @@ -38,7 +38,7 @@ import type { Position } from './positions-data-providers'; import * as Schema from '@vegaprotocol/types'; import { PositionStatus, PositionStatusMapping } from '@vegaprotocol/types'; import { DocsLinks } from '@vegaprotocol/environment'; -import { PositionTableActions } from './position-actions-dropdown'; +import { PositionActionsDropdown } from './position-actions-dropdown'; import { useAssetDetailsDialogStore } from '@vegaprotocol/assets'; import type { VegaWalletContextShape } from '@vegaprotocol/wallet'; import { LiquidationPrice } from './liquidation-price'; @@ -264,6 +264,7 @@ export const PositionsTable = forwardRef( if (!data) return null; return ( { openAssetDetailsDialog( data.assetId, @@ -449,7 +450,7 @@ export const PositionsTable = forwardRef( ) : null} {data?.assetId && ( - + )}
); diff --git a/libs/proposals/src/components/proposal-actions-dropdown.tsx b/libs/proposals/src/components/proposal-actions-dropdown.tsx index 0b9d56f85..43a1ed4b2 100644 --- a/libs/proposals/src/components/proposal-actions-dropdown.tsx +++ b/libs/proposals/src/components/proposal-actions-dropdown.tsx @@ -1,39 +1,27 @@ import { - DropdownMenu, - DropdownMenuContent, DropdownMenuItem, - DropdownMenuTrigger, VegaIcon, VegaIconNames, Link, + ActionsDropdown, } from '@vegaprotocol/ui-toolkit'; import { t } from '@vegaprotocol/i18n'; import { DApp, TOKEN_PROPOSAL, useLinks } from '@vegaprotocol/environment'; export const ProposalActionsDropdown = ({ id }: { id: string }) => { const linkCreator = useLinks(DApp.Token); + return ( - + + - - - } - > - - - - - {t('View proposal')} - - - - + + {t('View proposal')} + + + ); }; diff --git a/libs/proposals/src/components/proposals-list/proposals-list.tsx b/libs/proposals/src/components/proposals-list/proposals-list.tsx index d874bd8a5..13409df6d 100644 --- a/libs/proposals/src/components/proposals-list/proposals-list.tsx +++ b/libs/proposals/src/components/proposals-list/proposals-list.tsx @@ -19,7 +19,7 @@ export const getNewMarketProposals = (data: ProposalListFieldsFragment[]) => export const ProposalsList = () => { const gridRef = useRef(null); - const { data, error } = useProposalsListQuery({ + const { data } = useProposalsListQuery({ variables: { proposalType: Types.ProposalType.TYPE_NEW_MARKET, }, @@ -40,7 +40,7 @@ export const ProposalsList = () => { defaultColDef={defaultColDef} getRowId={({ data }) => data.id} style={{ width: '100%', height: '100%' }} - overlayNoRowsTemplate={error ? error.message : t('No markets')} + overlayNoRowsTemplate={t('No markets')} /> ); diff --git a/libs/proposals/src/lib/proposals-hooks/use-update-network-paramaters-toasts.tsx b/libs/proposals/src/lib/proposals-hooks/use-update-network-paramaters-toasts.tsx index eb6ee1e95..8b620c40b 100644 --- a/libs/proposals/src/lib/proposals-hooks/use-update-network-paramaters-toasts.tsx +++ b/libs/proposals/src/lib/proposals-hooks/use-update-network-paramaters-toasts.tsx @@ -37,11 +37,10 @@ const UpdateNetworkParameterToastContent = ({
{title}

- ' - {t( - `Update ${change.networkParameter.key} to ${change.networkParameter.value}` - )} - ' + '{t('Update ')} + {change.networkParameter.key} + {t(' to ')} + {change.networkParameter.value}'

{!isNaN(enactment) && (

diff --git a/libs/react-helpers/src/hooks/index.ts b/libs/react-helpers/src/hooks/index.ts index d63e0d6b8..fef03dd9c 100644 --- a/libs/react-helpers/src/hooks/index.ts +++ b/libs/react-helpers/src/hooks/index.ts @@ -11,5 +11,4 @@ export * from './use-theme-switcher'; export * from './use-storybook-theme-observer'; export * from './use-yesterday'; export * from './use-previous'; -export * from './use-pane-layout'; export * from './use-copy-timeout'; diff --git a/libs/trades/src/lib/trades-container.tsx b/libs/trades/src/lib/trades-container.tsx index 318ae5fbc..15c4fb407 100644 --- a/libs/trades/src/lib/trades-container.tsx +++ b/libs/trades/src/lib/trades-container.tsx @@ -3,7 +3,7 @@ import type { AgGridReact } from 'ag-grid-react'; import { useRef } from 'react'; import { tradesWithMarketProvider } from './trades-data-provider'; import { TradesTable } from './trades-table'; -import { useOrderStore } from '@vegaprotocol/orders'; +import { useCreateOrderStore } from '@vegaprotocol/orders'; import { t } from '@vegaprotocol/i18n'; interface TradesContainerProps { @@ -12,7 +12,8 @@ interface TradesContainerProps { export const TradesContainer = ({ marketId }: TradesContainerProps) => { const gridRef = useRef(null); - const updateOrder = useOrderStore((store) => store.update); + const useOrderStoreRef = useCreateOrderStore(); + const updateOrder = useOrderStoreRef((store) => store.update); const { data, error } = useDataProvider({ dataProvider: tradesWithMarketProvider, diff --git a/libs/ui-toolkit/src/components/dropdown-menu/actions-dropdown.tsx b/libs/ui-toolkit/src/components/dropdown-menu/actions-dropdown.tsx new file mode 100644 index 000000000..bd63862b6 --- /dev/null +++ b/libs/ui-toolkit/src/components/dropdown-menu/actions-dropdown.tsx @@ -0,0 +1,26 @@ +import { VegaIcon, VegaIconNames } from '../icon'; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuTrigger, +} from './dropdown-menu'; + +export const ActionsDropdownTrigger = () => { + return ( + + + + ); +}; + +type ActionMenuContentProps = React.ComponentProps; +export const ActionsDropdown = (props: ActionMenuContentProps) => { + return ( + }> + + + ); +}; diff --git a/libs/ui-toolkit/src/components/dropdown-menu/index.ts b/libs/ui-toolkit/src/components/dropdown-menu/index.ts index 2759d3ce6..cc428e45d 100644 --- a/libs/ui-toolkit/src/components/dropdown-menu/index.ts +++ b/libs/ui-toolkit/src/components/dropdown-menu/index.ts @@ -1 +1,2 @@ export * from './dropdown-menu'; +export * from './actions-dropdown'; diff --git a/libs/ui-toolkit/src/components/icon/vega-icons/svg-icons/icon-info.tsx b/libs/ui-toolkit/src/components/icon/vega-icons/svg-icons/icon-info.tsx new file mode 100644 index 000000000..84467122f --- /dev/null +++ b/libs/ui-toolkit/src/components/icon/vega-icons/svg-icons/icon-info.tsx @@ -0,0 +1,12 @@ +export const IconInfo = ({ size = 14 }: { size: number }) => { + return ( + + + + ); +}; diff --git a/libs/ui-toolkit/src/components/icon/vega-icons/vega-icon-record.ts b/libs/ui-toolkit/src/components/icon/vega-icons/vega-icon-record.ts index 51de5dc54..bde764b38 100644 --- a/libs/ui-toolkit/src/components/icon/vega-icons/vega-icon-record.ts +++ b/libs/ui-toolkit/src/components/icon/vega-icons/vega-icon-record.ts @@ -1,72 +1,75 @@ -import { IconBreakdown } from './svg-icons/icon-breakdown'; -import { IconCopy } from './svg-icons/icon-copy'; -import { IconDeposit } from './svg-icons/icon-deposit'; -import { IconWithdraw } from './svg-icons/icon-withdraw'; -import { IconTransfer } from './svg-icons/icon-transfer'; -import { IconEdit } from './svg-icons/icon-edit'; -import { IconMoon } from './svg-icons/icon-moon'; -import { IconGlobe } from './svg-icons/icon-globe'; -import { IconLinkedIn } from './svg-icons/icon-linkedin'; -import { IconTwitter } from './svg-icons/icon-twitter'; -import { IconQuestionMark } from './svg-icons/icon-question-mark'; -import { IconForum } from './svg-icons/icon-forum'; -import { IconOpenExternal } from './svg-icons/icon-open-external'; -import { IconArrowRight } from './svg-icons/icon-arrow-right'; -import { IconChevronUp } from './svg-icons/icon-chevron-up'; -import { IconTrendUp } from './svg-icons/icon-trend-up'; -import { IconCross } from './svg-icons/icon-cross'; -import { IconKebab } from './svg-icons/icon-kebab'; import { IconArrowDown } from './svg-icons/icon-arrow-down'; +import { IconArrowRight } from './svg-icons/icon-arrow-right'; +import { IconBreakdown } from './svg-icons/icon-breakdown'; import { IconChevronDown } from './svg-icons/icon-chevron-down'; +import { IconChevronUp } from './svg-icons/icon-chevron-up'; +import { IconCopy } from './svg-icons/icon-copy'; +import { IconCross } from './svg-icons/icon-cross'; +import { IconDeposit } from './svg-icons/icon-deposit'; +import { IconEdit } from './svg-icons/icon-edit'; +import { IconForum } from './svg-icons/icon-forum'; +import { IconGlobe } from './svg-icons/icon-globe'; +import { IconInfo } from './svg-icons/icon-info'; +import { IconKebab } from './svg-icons/icon-kebab'; +import { IconLinkedIn } from './svg-icons/icon-linkedin'; +import { IconMoon } from './svg-icons/icon-moon'; +import { IconOpenExternal } from './svg-icons/icon-open-external'; +import { IconQuestionMark } from './svg-icons/icon-question-mark'; import { IconTick } from './svg-icons/icon-tick'; +import { IconTransfer } from './svg-icons/icon-transfer'; +import { IconTrendUp } from './svg-icons/icon-trend-up'; +import { IconTwitter } from './svg-icons/icon-twitter'; +import { IconWithdraw } from './svg-icons/icon-withdraw'; export enum VegaIconNames { + ARROW_DOWN = 'arrow-down', + ARROW_RIGHT = 'arrow-right', BREAKDOWN = 'breakdown', + CHEVRON_DOWN = 'chevron-down', + CHEVRON_UP = 'chevron-up', COPY = 'copy', + CROSS = 'cross', DEPOSIT = 'deposit', - WITHDRAW = 'withdraw', EDIT = 'edit', - TRANSFER = 'transfer', FORUM = 'forum', GLOBE = 'globe', + INFO = 'info', + KEBAB = 'kebab', LINKEDIN = 'linkedin', - TWITTER = 'twitter', MOON = 'moon', OPEN_EXTERNAL = 'open-external', QUESTION_MARK = 'question-mark', - ARROW_RIGHT = 'arrow-right', - ARROW_DOWN = 'arrow-down', - CHEVRON_UP = 'chevron-up', - CHEVRON_DOWN = 'chevron-down', - TREND_UP = 'trend-up', - CROSS = 'cross', - KEBAB = 'kebab', TICK = 'tick', + TRANSFER = 'transfer', + TREND_UP = 'trend-up', + TWITTER = 'twitter', + WITHDRAW = 'withdraw', } export const VegaIconNameMap: Record< VegaIconNames, ({ size }: { size: number }) => JSX.Element > = { + 'arrow-down': IconArrowDown, + 'arrow-right': IconArrowRight, + 'chevron-down': IconChevronDown, + 'chevron-up': IconChevronUp, + 'open-external': IconOpenExternal, + 'question-mark': IconQuestionMark, + 'trend-up': IconTrendUp, breakdown: IconBreakdown, copy: IconCopy, - deposit: IconDeposit, - withdraw: IconWithdraw, - transfer: IconTransfer, - edit: IconEdit, - moon: IconMoon, - globe: IconGlobe, - linkedin: IconLinkedIn, - twitter: IconTwitter, - 'question-mark': IconQuestionMark, - forum: IconForum, - 'open-external': IconOpenExternal, - 'arrow-right': IconArrowRight, - 'arrow-down': IconArrowDown, - 'chevron-up': IconChevronUp, - 'chevron-down': IconChevronDown, - 'trend-up': IconTrendUp, cross: IconCross, + deposit: IconDeposit, + edit: IconEdit, + forum: IconForum, + globe: IconGlobe, + info: IconInfo, kebab: IconKebab, + linkedin: IconLinkedIn, + moon: IconMoon, tick: IconTick, + transfer: IconTransfer, + twitter: IconTwitter, + withdraw: IconWithdraw, }; diff --git a/libs/ui-toolkit/src/components/select/select.tsx b/libs/ui-toolkit/src/components/select/select.tsx index e71bae956..9eadf2502 100644 --- a/libs/ui-toolkit/src/components/select/select.tsx +++ b/libs/ui-toolkit/src/components/select/select.tsx @@ -48,24 +48,12 @@ export const RichSelect = forwardRef< const containerRef = useRef(); const contentRef = useRef(); - const setWidth = () => { - if (contentRef.current) { - contentRef.current.style.width = containerRef.current ? `450px` : 'auto'; - } - }; - return (

} className="flex items-center relative" > - { - setWidth(); - }} - defaultOpen={false} - > + } className={classNames( + 'relative', 'z-20', 'bg-white dark:bg-black', - 'border border-neutral-500 focus:border-black dark:focus:border-white', + 'border border-neutral-500 focus:border-black dark:focus:border-white rounded', 'overflow-hidden', 'shadow-lg' )} @@ -95,11 +84,11 @@ export const RichSelect = forwardRef< side={'bottom'} align={'center'} > - + {children} - + diff --git a/libs/withdraws/src/lib/asset-balance.tsx b/libs/withdraws/src/lib/asset-balance.tsx index 8c4cce702..86be241e8 100644 --- a/libs/withdraws/src/lib/asset-balance.tsx +++ b/libs/withdraws/src/lib/asset-balance.tsx @@ -2,7 +2,7 @@ import { useAccountBalance } from '@vegaprotocol/accounts'; import type { AssetFieldsFragment } from '@vegaprotocol/assets'; import { useBalancesStore } from '@vegaprotocol/assets'; import { Balance } from '@vegaprotocol/assets'; -import { addDecimal } from '@vegaprotocol/utils'; +import { addDecimal, formatNumber } from '@vegaprotocol/utils'; import BigNumber from 'bignumber.js'; import { useEffect } from 'react'; @@ -23,7 +23,10 @@ export const AssetBalance = ({ asset }: { asset: AssetFieldsFragment }) => { return ( ); diff --git a/libs/withdraws/src/lib/withdrawals-table.tsx b/libs/withdraws/src/lib/withdrawals-table.tsx index ff4fdc94f..189bedb7d 100644 --- a/libs/withdraws/src/lib/withdrawals-table.tsx +++ b/libs/withdraws/src/lib/withdrawals-table.tsx @@ -10,11 +10,9 @@ import { } from '@vegaprotocol/utils'; import { t } from '@vegaprotocol/i18n'; import { + ActionsDropdown, ButtonLink, - DropdownMenu, - DropdownMenuContent, DropdownMenuItem, - DropdownMenuTrigger, VegaIcon, VegaIconNames, } from '@vegaprotocol/ui-toolkit'; @@ -160,7 +158,7 @@ export type CompleteCellProps = { }; export const CompleteCell = ({ data, complete }: CompleteCellProps) => { const open = useWithdrawalApprovalDialog((state) => state.open); - const ref = useRef(null); + const ref = useRef(null); if (!data) { return null; @@ -176,32 +174,20 @@ export const CompleteCell = ({ data, complete }: CompleteCellProps) => { {t('Complete withdrawal')} - - - - } - > - - { - if (data.id) { - open(data.id, ref.current, false); - } - }} - > - - {t('View withdrawal details')} - - - + + { + if (data.id) { + open(data.id, ref.current, false); + } + }} + > + + {t('View withdrawal details')} + +
); };