diff --git a/apps/explorer/src/app/routes/network-parameters/network-parameters.tsx b/apps/explorer/src/app/routes/network-parameters/network-parameters.tsx index daf939573..10240cfcd 100644 --- a/apps/explorer/src/app/routes/network-parameters/network-parameters.tsx +++ b/apps/explorer/src/app/routes/network-parameters/network-parameters.tsx @@ -10,6 +10,7 @@ import { formatNumber, t, } from '@vegaprotocol/react-helpers'; +import { suitableForSyntaxHighlighter } from '@vegaprotocol/react-helpers'; import { RouteTitle } from '../../components/route-title'; import type { NetworkParametersQuery, @@ -58,7 +59,7 @@ export const NetworkParameterRow = ({ }: { row: NetworkParametersQuery_networkParameters; }) => { - const isSyntaxRow = isJsonObject(value); + const isSyntaxRow = suitableForSyntaxHighlighter(value); return ( { - try { - return JSON.parse(str) && Object.keys(JSON.parse(str)).length > 0; - } catch (e) { - return false; - } -}; - export const NETWORK_PARAMETERS_QUERY = gql` query NetworkParametersQuery { networkParameters { diff --git a/apps/token-e2e/src/integration/view/governance.cy.js b/apps/token-e2e/src/integration/view/governance.cy.js index bc361d473..fdb94d740 100644 --- a/apps/token-e2e/src/integration/view/governance.cy.js +++ b/apps/token-e2e/src/integration/view/governance.cy.js @@ -63,7 +63,10 @@ context( .and('have.text', 'There are no enacted or rejected proposals'); }); - it('should be able to see a connect wallet button - if vega wallet disconnected and new proposal button selected', function () { + // Skipping this test for now, the new proposal button no longer takes a user directly + // to a proposal form, instead it takes them to a page where they can select a proposal type. + // Keeping this test here for now as it can be repurposed to test the new proposal forms. + it.skip('should be able to see a connect wallet button - if vega wallet disconnected and new proposal button selected', function () { cy.get(newProposalButton).should('be.visible').click(); cy.get(connectToVegaWalletButton) .should('be.visible') diff --git a/apps/token/.env.devnet b/apps/token/.env.devnet index 451952344..f8d8c82da 100644 --- a/apps/token/.env.devnet +++ b/apps/token/.env.devnet @@ -7,3 +7,4 @@ NX_ETHEREUM_PROVIDER_URL=https://ropsten.infura.io/v3/4f846e79e13f44d1b51bbd7ed9 NX_ETHERSCAN_URL=https://ropsten.etherscan.io NX_GITHUB_FEEDBACK_URL=https://github.com/vegaprotocol/feedback/discussions NX_VEGA_EXPLORER_URL=https://dev.explorer.vega.xyz +NX_VEGA_DOCS_URL=https://docs.vega.xyz/docs/testnet diff --git a/apps/token/.env.mainnet b/apps/token/.env.mainnet index da47e4bb9..8c4b4b983 100644 --- a/apps/token/.env.mainnet +++ b/apps/token/.env.mainnet @@ -7,3 +7,4 @@ NX_ETHEREUM_PROVIDER_URL=https://mainnet.infura.io/v3/4f846e79e13f44d1b51bbd7ed9 NX_ETHERSCAN_URL=https://etherscan.io NX_GITHUB_FEEDBACK_URL=https://github.com/vegaprotocol/feedback/discussions NX_VEGA_EXPLORER_URL=https://explorer.vega.xyz +NX_VEGA_DOCS_URL=https://docs.vega.xyz/docs/mainnet diff --git a/apps/token/.env.stagnet3 b/apps/token/.env.stagnet3 index 42022681b..26989e5c4 100644 --- a/apps/token/.env.stagnet3 +++ b/apps/token/.env.stagnet3 @@ -7,6 +7,7 @@ NX_VEGA_ENV=STAGNET3 NX_VEGA_NETWORKS='{"DEVNET":"https://dev.token.vega.xyz","STAGNET3":"https://stagnet3.token.vega.xyz","TESTNET":"https://token.fairground.wtf","MAINNET":"https://token.vega.xyz"}' NX_VEGA_CONFIG_URL=https://static.vega.xyz/assets/stagnet3-network.json NX_VEGA_EXPLORER_URL=https://staging3.explorer.vega.xyz +NX_VEGA_DOCS_URL=https://docs.vega.xyz/docs/testnet # App flags NX_EXPLORER_ASSETS=1 diff --git a/apps/token/.env.testnet b/apps/token/.env.testnet index 628fd7b21..620838241 100644 --- a/apps/token/.env.testnet +++ b/apps/token/.env.testnet @@ -7,3 +7,4 @@ NX_ETHEREUM_PROVIDER_URL=https://ropsten.infura.io/v3/4f846e79e13f44d1b51bbd7ed9 NX_ETHERSCAN_URL=https://ropsten.etherscan.io NX_GITHUB_FEEDBACK_URL=https://github.com/vegaprotocol/feedback/discussions NX_VEGA_EXPLORER_URL=https://explorer.fairground.wtf +NX_VEGA_DOCS_URL=https://docs.vega.xyz/docs/testnet diff --git a/apps/token/src/config/env.ts b/apps/token/src/config/env.ts index 0cacbb24d..ebd3369fb 100644 --- a/apps/token/src/config/env.ts +++ b/apps/token/src/config/env.ts @@ -48,6 +48,8 @@ export const ENV = { // Environment dsn: windowOrDefault('NX_SENTRY_DSN'), urlConnect: TRUTHY.includes(windowOrDefault('NX_ETH_URL_CONNECT')), + explorerUrl: windowOrDefault('NX_VEGA_EXPLORER'), + docsUrl: windowOrDefault('NX_VEGA_DOCS_URL'), ethWalletMnemonic: windowOrDefault('NX_ETH_WALLET_MNEMONIC'), localProviderUrl: windowOrDefault('NX_LOCAL_PROVIDER_URL'), flags: { diff --git a/apps/token/src/config/index.ts b/apps/token/src/config/index.ts index 095810f4f..7e7dcb199 100644 --- a/apps/token/src/config/index.ts +++ b/apps/token/src/config/index.ts @@ -1,3 +1,3 @@ export * from './flags'; export * from './links'; -export * from './network-params'; +export * from './env'; diff --git a/apps/token/src/config/links.ts b/apps/token/src/config/links.ts index e93d28cbf..c48af1e6b 100644 --- a/apps/token/src/config/links.ts +++ b/apps/token/src/config/links.ts @@ -11,4 +11,5 @@ export const Links = { STAKING_GUIDE: 'https://docs.vega.xyz/docs/mainnet/concepts/vega-chain/#staking-on-vega', GOVERNANCE_PAGE: 'https://vega.xyz/governance', + PROPOSALS_GUIDE: 'https://docs.vega.xyz/docs/mainnet/tutorials/proposals', }; diff --git a/apps/token/src/config/network-params.ts b/apps/token/src/config/network-params.ts deleted file mode 100644 index 8ecd63225..000000000 --- a/apps/token/src/config/network-params.ts +++ /dev/null @@ -1,25 +0,0 @@ -export const NetworkParams = { - ETHEREUM_CONFIG: 'blockchains.ethereumConfig', - REWARD_ASSET: 'reward.asset', - REWARD_PAYOUT_DURATION: 'reward.staking.delegation.payoutDelay', - GOV_UPDATE_MARKET_REQUIRED_MAJORITY: - 'governance.proposal.updateMarket.requiredMajority', - GOV_UPDATE_MARKET_REQUIRED_PARTICIPATION: - 'governance.proposal.updateMarket.requiredParticipation', - GOV_NEW_MARKET_REQUIRED_MAJORITY: - 'governance.proposal.market.requiredMajority', - GOV_NEW_MARKET_REQUIRED_PARTICIPATION: - 'governance.proposal.market.requiredParticipation', - GOV_ASSET_REQUIRED_MAJORITY: 'governance.proposal.asset.requiredMajority', - GOV_ASSET_REQUIRED_PARTICIPATION: - 'governance.proposal.asset.requiredParticipation', - GOV_UPDATE_NET_PARAM_REQUIRED_MAJORITY: - 'governance.proposal.updateNetParam.requiredMajority', - GOV_UPDATE_NET_PARAM_REQUIRED_PARTICIPATION: - 'governance.proposal.updateNetParam.requiredParticipation', - GOV_FREEFORM_REQUIRED_PARTICIPATION: - 'governance.proposal.freeform.requiredParticipation', - GOV_FREEFORM_REQUIRED_MAJORITY: - 'governance.proposal.freeform.requiredMajority', - VALIDATOR_DELEGATION_MIN_AMOUNT: 'validators.delegation.minAmount', -}; diff --git a/apps/token/src/i18n/translations/dev.json b/apps/token/src/i18n/translations/dev.json index cdb4b97a1..de312845b 100644 --- a/apps/token/src/i18n/translations/dev.json +++ b/apps/token/src/i18n/translations/dev.json @@ -630,8 +630,59 @@ "FilterProposalsDescription": "Filter by proposal ID or proposer ID", "Freeform proposal": "Freeform proposal", "NewProposal": "New proposal", - "MinProposalRequirements": "You must have at least 1 VEGA associated to make a proposal", + "ProposalTypeQuestion": "What type of proposal would you like to make?", + "NetworkParameterProposal": "Update network parameter proposal", + "NewMarketProposal": "New market proposal", + "UpdateMarketProposal": "Update market proposal", + "NewAssetProposal": "New asset proposal", + "NewFreeformProposal": "New freeform proposal", + "NewRawProposal": "New raw proposal", + "MinProposalRequirements": "You must have at least {{value}} VEGA associated to make a proposal", "totalSupply": "Total Supply", "viaWallet": "via wallet", - "viaContract": "via vesting" + "viaContract": "via vesting", + "ProposalDocsPrefix": "For guidance on how to make proposals, see", + "NetworkParameter": "Network parameter", + "NewMarket": "New market", + "UpdateMarket": "Update market", + "NewAsset": "New asset", + "Freeform": "Freeform", + "RawProposal": "Let me choose (raw proposal)", + "UseMin": "Use minimum", + "UseMax": "Use maximum", + "Proposal": "Proposal", + "ProposalRationale": "Proposal rationale", + "ProposalTitle": "Title", + "ProposalTitleText": "Tell people what you are proposing and why (100 characters or less)", + "ProposalsGuide": "proposals guide", + "ProposalDescription": "Description", + "ProposalDescriptionText": "Full justification for what you are proposing (20,000 characters or less). Markdown is recommended. When linking to external resources please use IPFS", + "ProposalTerms": "Proposal terms (JSON format)", + "ProposalTermsText": "For more information visit", + "ProposalReference": "Reference", + "ProposalVoteTitle": "Vote deadline", + "ProposalVoteAndEnactmentTitle": "Vote deadline and enactment", + "ProposalVoteDeadline": "Time till voting closes", + "ProposalEnactmentDeadline": "Time till enactment (after vote close)", + "ProposalValidationDeadline": "Time till ERC-20 asset validation. Maximum value is affected by the vote deadline.", + "ThisWillSetVotingDeadlineTo": "This will set the voting deadline to", + "ThisWillSetEnactmentDeadlineTo": "This will set the enactment date to", + "ThisWillSetValidationDeadlineTo": "This will set the validation deadline to", + "Hours": "hours", + "ThisWillAdd2MinutesToAllowTimeToConfirmInWallet": "Note: we add 2 minutes of extra time when you choose the minimum value. This gives you time to confirm the proposal in your wallet.", + "SelectAMarketToChange": "Select a market to change", + "MarketName": "Market name", + "MarketCode": "Market code", + "MarketId": "Market ID", + "ProposeNewMarketTerms": "terms.changes.newMarket (JSON format)", + "ProposeUpdateMarketTerms": "terms.updateMarket.changes (JSON format)", + "SelectAParameterToChange": "Select a parameter to change", + "SelectParameter": "Select parameter", + "SelectMarket": "Select market", + "CurrentValue": "Current value", + "NewProposedValue": "New proposed value", + "MoreProposalsInfo": "To see Explorer data on proposals visit", + "MoreNetParamsInfo": "To see Explorer data on network params visit", + "MoreMarketsInfo": "To see Explorer data on existing markets visit", + "MoreAssetsInfo": "To see Explorer data on existing assets visit" } diff --git a/apps/token/src/routes/contracts/index.tsx b/apps/token/src/routes/contracts/index.tsx index 11e76ba76..9d5f03a99 100644 --- a/apps/token/src/routes/contracts/index.tsx +++ b/apps/token/src/routes/contracts/index.tsx @@ -6,8 +6,11 @@ import { useEnvironment } from '@vegaprotocol/environment'; import { Heading } from '../../components/heading'; import { SplashLoader } from '../../components/splash-loader'; import { ENV } from '../../config/env'; +import type { RouteChildProps } from '../index'; +import { useDocumentTitle } from '../../hooks/use-document-title'; -const Contracts = () => { +const Contracts = ({ name }: RouteChildProps) => { + useDocumentTitle(name); const { config } = useEthereumConfig(); const { ETHERSCAN_URL } = useEnvironment(); diff --git a/apps/token/src/routes/governance/components/propose/index.tsx b/apps/token/src/routes/governance/components/propose/index.tsx new file mode 100644 index 000000000..92f807ec4 --- /dev/null +++ b/apps/token/src/routes/governance/components/propose/index.tsx @@ -0,0 +1,8 @@ +export * from './proposal-form-subheader'; +export * from './proposal-form-min-requirements'; +export * from './proposal-form-title'; +export * from './proposal-form-description'; +export * from './proposal-form-terms'; +export * from './proposal-form-submit'; +export * from './proposal-form-transaction-dialog'; +export * from './proposal-form-vote-and-enactment-deadline'; diff --git a/apps/token/src/routes/governance/components/propose/proposal-form-description.spec.tsx b/apps/token/src/routes/governance/components/propose/proposal-form-description.spec.tsx new file mode 100644 index 000000000..de63017a3 --- /dev/null +++ b/apps/token/src/routes/governance/components/propose/proposal-form-description.spec.tsx @@ -0,0 +1,15 @@ +import { render, screen } from '@testing-library/react'; +import { ProposalFormDescription } from './proposal-form-description'; + +describe('Proposal Form Description', () => { + it('should display error text', () => { + const register = jest.fn(); + render( + + ); + expect(screen.getByText('Error text')).toBeInTheDocument(); + }); +}); diff --git a/apps/token/src/routes/governance/components/propose/proposal-form-description.tsx b/apps/token/src/routes/governance/components/propose/proposal-form-description.tsx new file mode 100644 index 000000000..7071406f1 --- /dev/null +++ b/apps/token/src/routes/governance/components/propose/proposal-form-description.tsx @@ -0,0 +1,32 @@ +import { useTranslation } from 'react-i18next'; +import { FormGroup, InputError, TextArea } from '@vegaprotocol/ui-toolkit'; +import type { UseFormRegisterReturn } from 'react-hook-form'; + +interface ProposalFormDescriptionProps { + registerField: UseFormRegisterReturn<'proposalDescription'>; + errorMessage: string | undefined; +} + +export const ProposalFormDescription = ({ + registerField: register, + errorMessage, +}: ProposalFormDescriptionProps) => { + const { t } = useTranslation(); + return ( + +