refactor: network params to return an object

This commit is contained in:
Matthew Russell
2022-09-13 20:49:59 -07:00
parent 1c5f44bb6c
commit a96bfeec8f
12 changed files with 401 additions and 381 deletions
@@ -1,59 +0,0 @@
import { useQuery } from '@apollo/client';
import { gql } from '@apollo/client';
import type { NetworkParams } from './__generated__/NetworkParams';
export const NETWORK_PARAMS_QUERY = gql`
query NetworkParams {
networkParameters {
key
value
}
}
`;
export function useNetworkParam(params: string[]) {
const { data, loading, error } = useQuery<NetworkParams, never>(
NETWORK_PARAMS_QUERY
);
const foundParams = data?.networkParameters
?.filter((p) => params.includes(p.key))
.sort((a, b) => params.indexOf(a.key) - params.indexOf(b.key));
return {
data: foundParams ? foundParams.map((f) => f.value) : null,
loading,
error,
};
}
export function useNetworkParamWithKeys(params: string[]) {
const { data, loading, error } = useQuery<NetworkParams, never>(
NETWORK_PARAMS_QUERY
);
const foundParams =
params.length === 0
? data?.networkParameters
: data?.networkParameters?.filter((p) => params.includes(p.key));
const sortedParams =
foundParams && foundParams.length > 0
? [...foundParams].sort((a, b) => {
if (a.key < b.key) {
return -1;
}
if (a.key > b.key) {
return 1;
}
return 0;
})
: null;
return {
data: sortedParams,
loading,
error,
};
}
@@ -1,7 +1,6 @@
import { useNetworkParams } from '@vegaprotocol/react-helpers';
import { useNetworkParams, NetworkParams } from '@vegaprotocol/react-helpers';
import React from 'react';
import { NetworkParams } from '../../../config';
import { useAppState } from '../../../contexts/app-state/app-state-context';
import { BigNumber } from '../../../lib/bignumber';
import { addDecimal } from '../../../lib/decimals';
@@ -16,63 +15,63 @@ const useProposalNetworkParams = ({
}: {
proposal: ProposalFields;
}) => {
const { data, loading } = useNetworkParams([
NetworkParams.GOV_UPDATE_MARKET_REQUIRED_MAJORITY,
NetworkParams.GOV_UPDATE_MARKET_REQUIRED_PARTICIPATION,
NetworkParams.GOV_NEW_MARKET_REQUIRED_MAJORITY,
NetworkParams.GOV_NEW_MARKET_REQUIRED_PARTICIPATION,
NetworkParams.GOV_ASSET_REQUIRED_MAJORITY,
NetworkParams.GOV_ASSET_REQUIRED_PARTICIPATION,
NetworkParams.GOV_UPDATE_NET_PARAM_REQUIRED_MAJORITY,
NetworkParams.GOV_UPDATE_NET_PARAM_REQUIRED_PARTICIPATION,
NetworkParams.GOV_FREEFORM_REQUIRED_MAJORITY,
NetworkParams.GOV_FREEFORM_REQUIRED_PARTICIPATION,
const { params } = useNetworkParams([
NetworkParams.governance_proposal_updateMarket_requiredMajority,
NetworkParams.governance_proposal_updateMarket_requiredParticipation,
NetworkParams.governance_proposal_market_requiredMajority,
NetworkParams.governance_proposal_market_requiredParticipation,
NetworkParams.governance_proposal_asset_requiredMajority,
NetworkParams.governance_proposal_asset_requiredParticipation,
NetworkParams.governance_proposal_updateNetParam_requiredMajority,
NetworkParams.governance_proposal_updateNetParam_requiredParticipation,
NetworkParams.governance_proposal_freeform_requiredMajority,
NetworkParams.governance_proposal_freeform_requiredParticipation,
]);
if (loading || !data) {
if (!params) {
return {
requiredMajority: new BigNumber(1),
requiredParticipation: new BigNumber(1),
};
}
const [
updateMarketMajority,
updateMarketParticipation,
newMarketMajority,
newMarketParticipation,
assetMajority,
assetParticipation,
paramMajority,
paramParticipation,
freeformMajority,
freeformParticipation,
] = data;
switch (proposal.terms.change.__typename) {
case 'UpdateMarket':
return {
requiredMajority: updateMarketMajority,
requiredParticipation: new BigNumber(updateMarketParticipation),
requiredMajority:
params.governance_proposal_updateMarket_requiredMajority,
requiredParticipation: new BigNumber(
params.governance_proposal_updateMarket_requiredParticipation
),
};
case 'UpdateNetworkParameter':
return {
requiredMajority: paramMajority,
requiredParticipation: new BigNumber(paramParticipation),
requiredMajority:
params.governance_proposal_updateNetParam_requiredMajority,
requiredParticipation: new BigNumber(
params.governance_proposal_updateNetParam_requiredParticipation
),
};
case 'NewAsset':
return {
requiredMajority: assetMajority,
requiredParticipation: new BigNumber(assetParticipation),
requiredMajority: params.governance_proposal_asset_requiredMajority,
requiredParticipation: new BigNumber(
params.governance_proposal_asset_requiredParticipation
),
};
case 'NewMarket':
return {
requiredMajority: newMarketMajority,
requiredParticipation: new BigNumber(newMarketParticipation),
requiredMajority: params.governance_proposal_market_requiredMajority,
requiredParticipation: new BigNumber(
params.governance_proposal_market_requiredParticipation
),
};
case 'NewFreeform':
return {
requiredMajority: freeformMajority,
requiredParticipation: freeformParticipation,
requiredMajority: params.governance_proposal_freeform_requiredMajority,
requiredParticipation: new BigNumber(
params.governance_proposal_freeform_requiredParticipation
),
};
default:
throw new Error('Unknown proposal type');
@@ -1,4 +1,3 @@
import { useMemo } from 'react';
import { useForm } from 'react-hook-form';
import { useTranslation } from 'react-i18next';
import {
@@ -19,9 +18,8 @@ import {
import { AsyncRenderer, Link } from '@vegaprotocol/ui-toolkit';
import { Heading } from '../../../../components/heading';
import { VegaWalletContainer } from '../../../../components/vega-wallet-container';
import { useNetworkParamWithKeys } from '../../../../hooks/use-network-param';
import { NetworkParams } from '../../../../config';
import type { ProposalFreeformTerms } from '@vegaprotocol/wallet';
import { useNetworkParams, NetworkParams } from '@vegaprotocol/react-helpers';
export interface FreeformProposalFormFields {
proposalVoteDeadline: string;
@@ -32,40 +30,13 @@ export interface FreeformProposalFormFields {
}
export const ProposeFreeform = () => {
const {
data: networkParamsData,
loading: networkParamsLoading,
error: networkParamsError,
} = useNetworkParamWithKeys([
NetworkParams.GOV_FREEFORM_MIN_CLOSE,
NetworkParams.GOV_FREEFORM_MAX_CLOSE,
NetworkParams.GOV_FREEFORM_MIN_PROPOSER_BALANCE,
NetworkParams.SPAM_PROTECTION_PROPOSAL_MIN_TOKENS,
const { params, loading, error } = useNetworkParams([
NetworkParams.governance_proposal_freeform_minClose,
NetworkParams.governance_proposal_freeform_maxClose,
NetworkParams.governance_proposal_freeform_minProposerBalance,
NetworkParams.spam_protection_proposal_min_tokens,
]);
const {
minVoteDeadline,
maxVoteDeadline,
minProposerBalance,
minSpamBalance,
} = useMemo(
() => ({
minVoteDeadline: networkParamsData?.find(
({ key }) => key === NetworkParams.GOV_FREEFORM_MIN_CLOSE
)?.value,
maxVoteDeadline: networkParamsData?.find(
({ key }) => key === NetworkParams.GOV_FREEFORM_MAX_CLOSE
)?.value,
minProposerBalance: networkParamsData?.find(
({ key }) => key === NetworkParams.GOV_FREEFORM_MIN_PROPOSER_BALANCE
)?.value,
minSpamBalance: networkParamsData?.find(
({ key }) => key === NetworkParams.SPAM_PROTECTION_PROPOSAL_MIN_TOKENS
)?.value,
}),
[networkParamsData]
);
const { VEGA_DOCS_URL, VEGA_EXPLORER_URL } = useEnvironment();
const { t } = useTranslation();
const {
@@ -89,18 +60,16 @@ export const ProposeFreeform = () => {
};
return (
<AsyncRenderer
loading={networkParamsLoading}
error={networkParamsError}
data={networkParamsData}
>
<AsyncRenderer loading={loading} error={error} data={params}>
<Heading title={t('NewFreeformProposal')} />
<VegaWalletContainer>
{() => (
<>
<ProposalFormMinRequirements
minProposerBalance={minProposerBalance}
spamProtectionMin={minSpamBalance}
minProposerBalance={
params.governance_proposal_freeform_minProposerBalance
}
spamProtectionMin={params.spam_protection_proposal_min_tokens}
/>
{VEGA_DOCS_URL && (
@@ -145,8 +114,8 @@ export const ProposeFreeform = () => {
required: t('Required'),
})}
voteErrorMessage={errors?.proposalVoteDeadline?.message}
voteMinClose={minVoteDeadline as string}
voteMaxClose={maxVoteDeadline as string}
voteMinClose={params.governance_proposal_freeform_minClose}
voteMaxClose={params.governance_proposal_freeform_maxClose}
/>
<ProposalFormSubmit isSubmitting={isSubmitting} />
@@ -1,7 +1,9 @@
import { useState, useMemo } from 'react';
import { useState } from 'react';
import { useTranslation } from 'react-i18next';
import { useForm } from 'react-hook-form';
import { isJsonObject } from '@vegaprotocol/react-helpers';
import type { NetworkParamsKey } from '@vegaprotocol/react-helpers';
import { NetworkParams } from '@vegaprotocol/react-helpers';
import { isJsonObject, useNetworkParams } from '@vegaprotocol/react-helpers';
import {
useProposalSubmit,
getClosingTimestamp,
@@ -30,9 +32,6 @@ import {
} from '@vegaprotocol/ui-toolkit';
import { Heading } from '../../../../components/heading';
import { VegaWalletContainer } from '../../../../components/vega-wallet-container';
import { useNetworkParamWithKeys } from '../../../../hooks/use-network-param';
import { NetworkParams } from '../../../../config';
import type { ProposalNetworkParameterTerms } from '@vegaprotocol/wallet';
interface SelectedNetworkParamCurrentValueProps {
value: string;
@@ -72,46 +71,21 @@ export interface NetworkParameterProposalFormFields {
export const ProposeNetworkParameter = () => {
const [selectedNetworkParam, setSelectedNetworkParam] = useState<
string | undefined
NetworkParamsKey | undefined
>(undefined);
const {
data: networkParamsData,
params,
loading: networkParamsLoading,
error: networkParamsError,
} = useNetworkParamWithKeys([]);
const {
minVoteDeadline,
maxVoteDeadline,
minEnactmentDeadline,
maxEnactmentDeadline,
minProposerBalance,
minSpamBalance,
} = useMemo(
() => ({
minVoteDeadline: networkParamsData?.find(
({ key }) => key === NetworkParams.GOV_UPDATE_NET_PARAM_MIN_CLOSE
)?.value,
maxVoteDeadline: networkParamsData?.find(
({ key }) => key === NetworkParams.GOV_UPDATE_NET_PARAM_MAX_CLOSE
)?.value,
minEnactmentDeadline: networkParamsData?.find(
({ key }) => key === NetworkParams.GOV_UPDATE_NET_PARAM_MIN_ENACT
)?.value,
maxEnactmentDeadline: networkParamsData?.find(
({ key }) => key === NetworkParams.GOV_UPDATE_NET_PARAM_MAX_ENACT
)?.value,
minProposerBalance: networkParamsData?.find(
({ key }) =>
key === NetworkParams.GOV_UPDATE_NET_PARAM_MIN_PROPOSER_BALANCE
)?.value,
minSpamBalance: networkParamsData?.find(
({ key }) => key === NetworkParams.SPAM_PROTECTION_PROPOSAL_MIN_TOKENS
)?.value,
}),
[networkParamsData]
);
} = useNetworkParams([
NetworkParams.governance_proposal_updateNetParam_maxClose,
NetworkParams.governance_proposal_updateNetParam_minClose,
NetworkParams.governance_proposal_updateNetParam_maxEnact,
NetworkParams.governance_proposal_updateNetParam_minEnact,
NetworkParams.governance_proposal_updateNetParam_minProposerBalance,
NetworkParams.spam_protection_proposal_min_tokens,
]);
const { VEGA_EXPLORER_URL, VEGA_DOCS_URL } = useEnvironment();
const { t } = useTranslation();
@@ -140,7 +114,7 @@ export const ProposeNetworkParameter = () => {
fields.proposalVoteDeadline,
fields.proposalEnactmentDeadline
),
} as ProposalNetworkParameterTerms,
},
});
};
@@ -148,15 +122,17 @@ export const ProposeNetworkParameter = () => {
<AsyncRenderer
loading={networkParamsLoading}
error={networkParamsError}
data={networkParamsData}
data={params}
>
<Heading title={t('NetworkParameterProposal')} />
<VegaWalletContainer>
{() => (
<>
<ProposalFormMinRequirements
minProposerBalance={minProposerBalance}
spamProtectionMin={minSpamBalance}
minProposerBalance={
params.governance_proposal_updateNetParam_minProposerBalance
}
spamProtectionMin={params.spam_protection_proposal_min_tokens}
/>
{VEGA_DOCS_URL && (
@@ -213,11 +189,15 @@ export const ProposeNetworkParameter = () => {
{...register('proposalNetworkParameterKey', {
required: t('Required'),
})}
onChange={(e) => setSelectedNetworkParam(e.target.value)}
onChange={(e) =>
setSelectedNetworkParam(
e.target.value as NetworkParamsKey
)
}
value={selectedNetworkParam}
>
<option value="">{t('SelectParameter')}</option>
{networkParamsData?.map(({ key }) => (
{Object.keys(params).map((key) => (
<option key={key} value={key}>
{key}
</option>
@@ -233,11 +213,7 @@ export const ProposeNetworkParameter = () => {
{selectedNetworkParam && (
<div className="mt-[-10px]">
<SelectedNetworkParamCurrentValue
value={
networkParamsData?.find(
({ key }) => key === selectedNetworkParam
)?.value || ''
}
value={params[selectedNetworkParam]}
/>
<FormGroup
@@ -265,16 +241,24 @@ export const ProposeNetworkParameter = () => {
required: t('Required'),
})}
voteErrorMessage={errors?.proposalVoteDeadline?.message}
voteMinClose={minVoteDeadline as string}
voteMaxClose={maxVoteDeadline as string}
voteMinClose={
params.governance_proposal_updateNetParam_minClose
}
voteMaxClose={
params.governance_proposal_updateNetParam_maxClose
}
enactmentRegister={register('proposalEnactmentDeadline', {
required: t('Required'),
})}
enactmentErrorMessage={
errors?.proposalEnactmentDeadline?.message
}
enactmentMinClose={minEnactmentDeadline as string}
enactmentMaxClose={maxEnactmentDeadline as string}
enactmentMinClose={
params.governance_proposal_updateNetParam_minEnact
}
enactmentMaxClose={
params.governance_proposal_updateNetParam_maxEnact
}
/>
<ProposalFormSubmit isSubmitting={isSubmitting} />
@@ -1,4 +1,3 @@
import { useMemo } from 'react';
import { useForm } from 'react-hook-form';
import { useTranslation } from 'react-i18next';
import {
@@ -22,9 +21,8 @@ import {
import { AsyncRenderer, Link } from '@vegaprotocol/ui-toolkit';
import { Heading } from '../../../../components/heading';
import { VegaWalletContainer } from '../../../../components/vega-wallet-container';
import { useNetworkParamWithKeys } from '../../../../hooks/use-network-param';
import { NetworkParams } from '../../../../config';
import type { ProposalNewAssetTerms } from '@vegaprotocol/wallet';
import { NetworkParams, useNetworkParams } from '@vegaprotocol/react-helpers';
export interface NewAssetProposalFormFields {
proposalVoteDeadline: string;
@@ -38,49 +36,18 @@ export interface NewAssetProposalFormFields {
export const ProposeNewAsset = () => {
const {
data: networkParamsData,
params,
loading: networkParamsLoading,
error: networkParamsError,
} = useNetworkParamWithKeys([
NetworkParams.GOV_ASSET_MIN_CLOSE,
NetworkParams.GOV_ASSET_MAX_CLOSE,
NetworkParams.GOV_ASSET_MIN_ENACT,
NetworkParams.GOV_ASSET_MAX_ENACT,
NetworkParams.GOV_ASSET_MIN_PROPOSER_BALANCE,
NetworkParams.SPAM_PROTECTION_PROPOSAL_MIN_TOKENS,
} = useNetworkParams([
NetworkParams.governance_proposal_asset_minClose,
NetworkParams.governance_proposal_asset_maxClose,
NetworkParams.governance_proposal_asset_minEnact,
NetworkParams.governance_proposal_asset_maxEnact,
NetworkParams.governance_proposal_asset_minProposerBalance,
NetworkParams.spam_protection_proposal_min_tokens,
]);
const {
minVoteDeadline,
maxVoteDeadline,
minEnactmentDeadline,
maxEnactmentDeadline,
minProposerBalance,
minSpamBalance,
} = useMemo(
() => ({
minVoteDeadline: networkParamsData?.find(
({ key }) => key === NetworkParams.GOV_ASSET_MIN_CLOSE
)?.value,
maxVoteDeadline: networkParamsData?.find(
({ key }) => key === NetworkParams.GOV_ASSET_MAX_CLOSE
)?.value,
minEnactmentDeadline: networkParamsData?.find(
({ key }) => key === NetworkParams.GOV_ASSET_MIN_ENACT
)?.value,
maxEnactmentDeadline: networkParamsData?.find(
({ key }) => key === NetworkParams.GOV_ASSET_MAX_ENACT
)?.value,
minProposerBalance: networkParamsData?.find(
({ key }) => key === NetworkParams.GOV_ASSET_MIN_PROPOSER_BALANCE
)?.value,
minSpamBalance: networkParamsData?.find(
({ key }) => key === NetworkParams.SPAM_PROTECTION_PROPOSAL_MIN_TOKENS
)?.value,
}),
[networkParamsData]
);
const { VEGA_EXPLORER_URL, VEGA_DOCS_URL } = useEnvironment();
const { t } = useTranslation();
const {
@@ -116,15 +83,17 @@ export const ProposeNewAsset = () => {
<AsyncRenderer
loading={networkParamsLoading}
error={networkParamsError}
data={networkParamsData}
data={params}
>
<Heading title={t('NewAssetProposal')} />
<VegaWalletContainer>
{() => (
<>
<ProposalFormMinRequirements
minProposerBalance={minProposerBalance}
spamProtectionMin={minSpamBalance}
minProposerBalance={
params.governance_proposal_asset_minProposerBalance
}
spamProtectionMin={params.spam_protection_proposal_min_tokens}
/>
{VEGA_DOCS_URL && (
@@ -190,16 +159,16 @@ export const ProposeNewAsset = () => {
required: t('Required'),
})}
voteErrorMessage={errors?.proposalVoteDeadline?.message}
voteMinClose={minVoteDeadline as string}
voteMaxClose={maxVoteDeadline as string}
voteMinClose={params.governance_proposal_asset_minClose}
voteMaxClose={params.governance_proposal_asset_maxClose}
enactmentRegister={register('proposalEnactmentDeadline', {
required: t('Required'),
})}
enactmentErrorMessage={
errors?.proposalEnactmentDeadline?.message
}
enactmentMinClose={minEnactmentDeadline as string}
enactmentMaxClose={maxEnactmentDeadline as string}
enactmentMinClose={params.governance_proposal_asset_minEnact}
enactmentMaxClose={params.governance_proposal_asset_maxEnact}
validationRequired={true}
validationRegister={register('proposalValidationDeadline', {
required: t('Required'),
@@ -1,4 +1,3 @@
import { useMemo } from 'react';
import { useForm } from 'react-hook-form';
import { useTranslation } from 'react-i18next';
import {
@@ -21,9 +20,8 @@ import {
import { AsyncRenderer, Link } from '@vegaprotocol/ui-toolkit';
import { Heading } from '../../../../components/heading';
import { VegaWalletContainer } from '../../../../components/vega-wallet-container';
import { useNetworkParamWithKeys } from '../../../../hooks/use-network-param';
import { NetworkParams } from '../../../../config';
import type { ProposalNewMarketTerms } from '@vegaprotocol/wallet';
import { NetworkParams, useNetworkParams } from '@vegaprotocol/react-helpers';
export interface NewMarketProposalFormFields {
proposalVoteDeadline: string;
@@ -36,49 +34,18 @@ export interface NewMarketProposalFormFields {
export const ProposeNewMarket = () => {
const {
data: networkParamsData,
params,
loading: networkParamsLoading,
error: networkParamsError,
} = useNetworkParamWithKeys([
NetworkParams.GOV_NEW_MARKET_MIN_CLOSE,
NetworkParams.GOV_NEW_MARKET_MAX_CLOSE,
NetworkParams.GOV_NEW_MARKET_MIN_ENACT,
NetworkParams.GOV_NEW_MARKET_MAX_ENACT,
NetworkParams.GOV_NEW_MARKET_MIN_PROPOSER_BALANCE,
NetworkParams.SPAM_PROTECTION_PROPOSAL_MIN_TOKENS,
} = useNetworkParams([
NetworkParams.governance_proposal_market_maxClose,
NetworkParams.governance_proposal_market_minClose,
NetworkParams.governance_proposal_market_maxEnact,
NetworkParams.governance_proposal_market_minEnact,
NetworkParams.governance_proposal_market_minProposerBalance,
NetworkParams.spam_protection_proposal_min_tokens,
]);
const {
minVoteDeadline,
maxVoteDeadline,
minEnactmentDeadline,
maxEnactmentDeadline,
minProposerBalance,
minSpamBalance,
} = useMemo(
() => ({
minVoteDeadline: networkParamsData?.find(
({ key }) => key === NetworkParams.GOV_NEW_MARKET_MIN_CLOSE
)?.value,
maxVoteDeadline: networkParamsData?.find(
({ key }) => key === NetworkParams.GOV_NEW_MARKET_MAX_CLOSE
)?.value,
minEnactmentDeadline: networkParamsData?.find(
({ key }) => key === NetworkParams.GOV_NEW_MARKET_MIN_ENACT
)?.value,
maxEnactmentDeadline: networkParamsData?.find(
({ key }) => key === NetworkParams.GOV_NEW_MARKET_MAX_ENACT
)?.value,
minProposerBalance: networkParamsData?.find(
({ key }) => key === NetworkParams.GOV_NEW_MARKET_MIN_PROPOSER_BALANCE
)?.value,
minSpamBalance: networkParamsData?.find(
({ key }) => key === NetworkParams.SPAM_PROTECTION_PROPOSAL_MIN_TOKENS
)?.value,
}),
[networkParamsData]
);
const { VEGA_EXPLORER_URL, VEGA_DOCS_URL } = useEnvironment();
const { t } = useTranslation();
const {
@@ -111,15 +78,17 @@ export const ProposeNewMarket = () => {
<AsyncRenderer
loading={networkParamsLoading}
error={networkParamsError}
data={networkParamsData}
data={params}
>
<Heading title={t('NewMarketProposal')} />
<VegaWalletContainer>
{() => (
<>
<ProposalFormMinRequirements
minProposerBalance={minProposerBalance}
spamProtectionMin={minSpamBalance}
minProposerBalance={
params.governance_proposal_market_minProposerBalance
}
spamProtectionMin={params.spam_protection_proposal_min_tokens}
/>
{VEGA_DOCS_URL && (
@@ -186,16 +155,16 @@ export const ProposeNewMarket = () => {
required: t('Required'),
})}
voteErrorMessage={errors?.proposalVoteDeadline?.message}
voteMinClose={minVoteDeadline as string}
voteMaxClose={maxVoteDeadline as string}
voteMinClose={params.governance_proposal_market_minClose}
voteMaxClose={params.governance_proposal_market_maxClose}
enactmentRegister={register('proposalEnactmentDeadline', {
required: t('Required'),
})}
enactmentErrorMessage={
errors?.proposalEnactmentDeadline?.message
}
enactmentMinClose={minEnactmentDeadline as string}
enactmentMaxClose={maxEnactmentDeadline as string}
enactmentMinClose={params.governance_proposal_market_minEnact}
enactmentMaxClose={params.governance_proposal_market_maxEnact}
/>
<ProposalFormSubmit isSubmitting={isSubmitting} />
@@ -29,10 +29,9 @@ import {
} from '@vegaprotocol/ui-toolkit';
import { Heading } from '../../../../components/heading';
import { VegaWalletContainer } from '../../../../components/vega-wallet-container';
import { useNetworkParamWithKeys } from '../../../../hooks/use-network-param';
import { NetworkParams } from '../../../../config';
import type { ProposalUpdateMarketTerms } from '@vegaprotocol/wallet';
import type { ProposalMarketsQuery } from './__generated__/ProposalMarketsQuery';
import { NetworkParams, useNetworkParams } from '@vegaprotocol/react-helpers';
const MARKETS_QUERY = gql`
query ProposalMarketsQuery {
@@ -64,16 +63,16 @@ export interface UpdateMarketProposalFormFields {
export const ProposeUpdateMarket = () => {
const {
data: networkParamsData,
params,
loading: networkParamsLoading,
error: networkParamsError,
} = useNetworkParamWithKeys([
NetworkParams.GOV_UPDATE_MARKET_MIN_CLOSE,
NetworkParams.GOV_UPDATE_MARKET_MAX_CLOSE,
NetworkParams.GOV_UPDATE_MARKET_MIN_ENACT,
NetworkParams.GOV_UPDATE_MARKET_MAX_ENACT,
NetworkParams.GOV_UPDATE_MARKET_MIN_PROPOSER_BALANCE,
NetworkParams.SPAM_PROTECTION_PROPOSAL_MIN_TOKENS,
} = useNetworkParams([
NetworkParams.governance_proposal_updateMarket_maxClose,
NetworkParams.governance_proposal_updateMarket_minClose,
NetworkParams.governance_proposal_updateMarket_maxEnact,
NetworkParams.governance_proposal_updateMarket_minEnact,
NetworkParams.governance_proposal_updateMarket_minProposerBalance,
NetworkParams.spam_protection_proposal_min_tokens,
]);
const {
@@ -103,38 +102,6 @@ export const ProposeUpdateMarket = () => {
});
}, [marketsData]);
const {
minVoteDeadline,
maxVoteDeadline,
minEnactmentDeadline,
maxEnactmentDeadline,
minProposerBalance,
minSpamBalance,
} = useMemo(
() => ({
minVoteDeadline: networkParamsData?.find(
({ key }) => key === NetworkParams.GOV_UPDATE_MARKET_MIN_CLOSE
)?.value,
maxVoteDeadline: networkParamsData?.find(
({ key }) => key === NetworkParams.GOV_UPDATE_MARKET_MAX_CLOSE
)?.value,
minEnactmentDeadline: networkParamsData?.find(
({ key }) => key === NetworkParams.GOV_UPDATE_MARKET_MIN_ENACT
)?.value,
maxEnactmentDeadline: networkParamsData?.find(
({ key }) => key === NetworkParams.GOV_UPDATE_MARKET_MAX_ENACT
)?.value,
minProposerBalance: networkParamsData?.find(
({ key }) =>
key === NetworkParams.GOV_UPDATE_MARKET_MIN_PROPOSER_BALANCE
)?.value,
minSpamBalance: networkParamsData?.find(
({ key }) => key === NetworkParams.SPAM_PROTECTION_PROPOSAL_MIN_TOKENS
)?.value,
}),
[networkParamsData]
);
const [selectedMarket, setSelectedMarket] = useState<string | undefined>(
undefined
);
@@ -174,15 +141,17 @@ export const ProposeUpdateMarket = () => {
<AsyncRenderer
loading={networkParamsLoading && marketsLoading}
error={networkParamsError && marketsError}
data={networkParamsData && marketsData}
data={params && marketsData}
>
<Heading title={t('UpdateMarketProposal')} />
<VegaWalletContainer>
{() => (
<>
<ProposalFormMinRequirements
minProposerBalance={minProposerBalance}
spamProtectionMin={minSpamBalance}
minProposerBalance={
params.governance_proposal_updateMarket_minProposerBalance
}
spamProtectionMin={params.spam_protection_proposal_min_tokens}
/>
{VEGA_EXPLORER_URL && (
@@ -296,16 +265,24 @@ export const ProposeUpdateMarket = () => {
required: t('Required'),
})}
voteErrorMessage={errors?.proposalVoteDeadline?.message}
voteMinClose={minVoteDeadline as string}
voteMaxClose={maxVoteDeadline as string}
voteMinClose={
params.governance_proposal_updateMarket_minClose
}
voteMaxClose={
params.governance_proposal_updateMarket_maxClose
}
enactmentRegister={register('proposalEnactmentDeadline', {
required: t('Required'),
})}
enactmentErrorMessage={
errors?.proposalEnactmentDeadline?.message
}
enactmentMinClose={minEnactmentDeadline as string}
enactmentMaxClose={maxEnactmentDeadline as string}
enactmentMinClose={
params.governance_proposal_updateMarket_minEnact
}
enactmentMaxClose={
params.governance_proposal_updateMarket_maxEnact
}
/>
<ProposalFormSubmit isSubmitting={isSubmitting} />
+12 -16
View File
@@ -10,7 +10,6 @@ import { useTranslation } from 'react-i18next';
import { EpochCountdown } from '../../../components/epoch-countdown';
import { Heading } from '../../../components/heading';
import { SplashLoader } from '../../../components/splash-loader';
import { NetworkParams } from '../../../config';
import {
AppStateActionType,
useAppState,
@@ -18,7 +17,7 @@ import {
import type { Rewards } from './__generated__/Rewards';
import { RewardInfo } from './reward-info';
import { useVegaWallet } from '@vegaprotocol/wallet';
import { useNetworkParams } from '@vegaprotocol/react-helpers';
import { useNetworkParams, NetworkParams } from '@vegaprotocol/react-helpers';
export const REWARDS_QUERY = gql`
query Rewards($partyId: ID!) {
@@ -73,33 +72,30 @@ export const RewardsIndex = () => {
variables: { partyId: keypair?.pub },
skip: !keypair?.pub,
});
const {
data: rewardAssetData,
loading: rewardAssetLoading,
error: rewardAssetError,
} = useNetworkParams([
NetworkParams.REWARD_ASSET,
NetworkParams.REWARD_PAYOUT_DURATION,
const { params } = useNetworkParams([
NetworkParams.reward_asset,
NetworkParams.reward_staking_delegation_payoutDelay,
]);
const payoutDuration = React.useMemo(() => {
if (!rewardAssetData || !rewardAssetData[1]) {
if (!params) {
return 0;
}
return new Duration(rewardAssetData[1]).milliseconds();
}, [rewardAssetData]);
return new Duration(
params.reward_staking_delegation_payoutDelay
).milliseconds();
}, [params]);
if (error || rewardAssetError) {
if (error) {
return (
<section>
<p>{t('Something went wrong')}</p>
{error && <pre>{error.message}</pre>}
{rewardAssetError && <pre>{rewardAssetError.message}</pre>}
</section>
);
}
if (loading || rewardAssetLoading || !rewardAssetData?.length) {
if (loading || !params) {
return (
<Splash>
<SplashLoader />
@@ -145,7 +141,7 @@ export const RewardsIndex = () => {
<RewardInfo
currVegaKey={keypair}
data={data}
rewardAssetId={rewardAssetData[0]}
rewardAssetId={params.reward_asset}
/>
) : (
<div>
@@ -5,7 +5,6 @@ import { useTranslation } from 'react-i18next';
import { useNavigate } from 'react-router-dom';
import { TokenInput } from '../../components/token-input';
import { NetworkParams } from '../../config';
import { useAppState } from '../../contexts/app-state/app-state-context';
import { useSearchParams } from '../../hooks/use-search-params';
import { BigNumber } from '../../lib/bignumber';
@@ -30,7 +29,7 @@ import type {
UndelegateSubmissionBody,
} from '@vegaprotocol/wallet';
import { useVegaWallet } from '@vegaprotocol/wallet';
import { useNetworkParam } from '@vegaprotocol/react-helpers';
import { useNetworkParam, NetworkParams } from '@vegaprotocol/react-helpers';
export const PARTY_DELEGATIONS_QUERY = gql`
query PartyDelegations($partyId: ID!) {
@@ -103,14 +102,14 @@ export const StakingForm = ({
setAmount('');
}, [action, setAmount]);
const { data } = useNetworkParam(
NetworkParams.VALIDATOR_DELEGATION_MIN_AMOUNT
const { param: minAmount } = useNetworkParam(
NetworkParams.validators_delegation_minAmount
);
const minTokensWithDecimals = React.useMemo(() => {
const minTokens = new BigNumber(data && data.length === 1 ? data[0] : '');
const minTokens = new BigNumber(minAmount !== null ? minAmount : '');
return addDecimal(minTokens, appState.decimals);
}, [appState.decimals, data]);
}, [appState.decimals, minAmount]);
const maxDelegation = React.useMemo(() => {
if (action === Actions.Add) {
@@ -1,15 +1,13 @@
import { gql, useQuery } from '@apollo/client';
import type { LiquidityProvisionStatus } from '@vegaprotocol/types';
import { AccountType } from '@vegaprotocol/types';
import { useNetworkParam } from '@vegaprotocol/react-helpers';
import { useNetworkParam, NetworkParams } from '@vegaprotocol/react-helpers';
import BigNumber from 'bignumber.js';
import type {
MarketLiquidity,
MarketLiquidity_market_data_liquidityProviderFeeShare,
} from './__generated__';
const SISKA_NETWORK_PARAMETER = 'market.liquidity.stakeToCcySiskas';
const MARKET_LIQUIDITY_QUERY = gql`
query MarketLiquidity($marketId: ID!, $partyId: String) {
market(id: $marketId) {
@@ -106,7 +104,9 @@ export const useLiquidityProvision = ({
partyId?: string;
marketId?: string;
}) => {
const { data: stakeToCcySiskas } = useNetworkParam(SISKA_NETWORK_PARAMETER);
const { param: stakeToCcySiskas } = useNetworkParam(
NetworkParams.market_liquidity_stakeToCcySiskas
);
const stakeToCcySiska = stakeToCcySiskas && stakeToCcySiskas[0];
const { data, loading, error } = useQuery<MarketLiquidity>(
MARKET_LIQUIDITY_QUERY,
@@ -0,0 +1,116 @@
import { renderHook, waitFor } from '@testing-library/react';
import type { MockedResponse } from '@apollo/client/testing';
import { MockedProvider } from '@apollo/client/testing';
import type { NetworkParamsKey } from './use-network-params';
import {
NetworkParams,
NETWORK_PARAMETERS_QUERY,
NETWORK_PARAMETER_QUERY,
useNetworkParam,
useNetworkParams,
} from './use-network-params';
import type { ReactNode } from 'react';
import type { NetworkParams as NetworkParamsResponse } from './__generated__';
import { act } from 'react-dom/test-utils';
describe('useNetworkParam', () => {
const setup = (arg: NetworkParamsKey) => {
const mock: MockedResponse = {
request: {
query: NETWORK_PARAMETER_QUERY,
variables: {
key: arg,
},
},
result: {
data: {
networkParameter: {
__typename: 'NetworkParameter',
key: 'reward.staking.delegation.payoutDelay',
value: '200',
},
},
},
};
const wrapper = ({ children }: { children: ReactNode }) => (
<MockedProvider mocks={[mock]}>{children}</MockedProvider>
);
return renderHook(() => useNetworkParam(arg), { wrapper });
};
it('returns a single param value', async () => {
const { result } = setup(
NetworkParams.reward_staking_delegation_payoutDelay
);
expect(result.current.param).toBe(null);
await waitFor(() => {
expect(result.current.param).toEqual('200');
});
});
});
describe('useNetworkParams', () => {
const setup = (args?: NetworkParamsKey[]) => {
const mock: MockedResponse<NetworkParamsResponse> = {
request: {
query: NETWORK_PARAMETERS_QUERY,
},
result: {
data: {
networkParameters: [
{
__typename: 'NetworkParameter',
key: 'spam.protection.proposal.min.tokens',
value: '1',
},
{
__typename: 'NetworkParameter',
key: 'governance.proposal.updateMarket.minProposerBalance',
value: '1',
},
{
__typename: 'NetworkParameter',
key: 'reward.staking.delegation.payoutDelay',
value: '200',
},
],
},
},
};
const wrapper = ({ children }: { children: ReactNode }) => (
<MockedProvider mocks={[mock]}>{children}</MockedProvider>
);
return renderHook(() => useNetworkParams(args), { wrapper });
};
it('returns an object with only desired params', async () => {
const { result } = setup([
NetworkParams.spam_protection_proposal_min_tokens,
NetworkParams.governance_proposal_updateMarket_minProposerBalance,
]);
expect(result.current.params).toBe(null);
await waitFor(() => {
expect(result.current.params).toEqual({
spam_protection_proposal_min_tokens: '1',
governance_proposal_updateMarket_minProposerBalance: '1',
});
});
});
it('returns all params', async () => {
const { result } = setup();
expect(result.current.params).toBe(null);
await waitFor(() => {
expect(result.current.params).toEqual({
spam_protection_proposal_min_tokens: '1',
governance_proposal_updateMarket_minProposerBalance: '1',
reward_staking_delegation_payoutDelay: '200',
});
});
});
});
@@ -1,5 +1,6 @@
import { gql, useQuery } from '@apollo/client';
import type { NetworkParams } from './__generated__/NetworkParams';
import { useMemo } from 'react';
import type { NetworkParams as NetworkParamsResponse } from './__generated__';
export const NETWORK_PARAMETERS_QUERY = gql`
query NetworkParams {
@@ -10,27 +11,127 @@ export const NETWORK_PARAMETERS_QUERY = gql`
}
`;
export const useNetworkParam = (param: string) => {
const { data, loading, error } = useQuery<NetworkParams, never>(
export const NETWORK_PARAMETER_QUERY = gql`
query NetworkParam($key: String!) {
networkParameter(key: $key) {
key
value
}
}
`;
export const NetworkParams = {
blockchains_ethereumConfig: 'blockchains_ethereumConfig',
reward_asset: 'reward_asset',
reward_staking_delegation_payoutDelay:
'reward_staking_delegation_payoutDelay',
governance_proposal_updateMarket_requiredMajority:
'governance_proposal_updateMarket_requiredMajority',
governance_proposal_market_minClose: 'governance_proposal_market_minClose',
governance_proposal_market_maxClose: 'governance_proposal_market_maxClose',
governance_proposal_market_minEnact: 'governance_proposal_market_minEnact',
governance_proposal_market_maxEnact: 'governance_proposal_market_maxEnact',
governance_proposal_updateMarket_minClose:
'governance_proposal_updateMarket_minClose',
governance_proposal_updateMarket_maxClose:
'governance_proposal_updateMarket_maxClose',
governance_proposal_updateMarket_minEnact:
'governance_proposal_updateMarket_minEnact',
governance_proposal_updateMarket_maxEnact:
'governance_proposal_updateMarket_maxEnact',
governance_proposal_asset_minClose: 'governance_proposal_asset_minClose',
governance_proposal_asset_maxClose: 'governance_proposal_asset_maxClose',
governance_proposal_asset_minEnact: 'governance_proposal_asset_minEnact',
governance_proposal_asset_maxEnact: 'governance_proposal_asset_maxEnact',
governance_proposal_updateNetParam_minClose:
'governance_proposal_updateNetParam_minClose',
governance_proposal_updateNetParam_maxClose:
'governance_proposal_updateNetParam_maxClose',
governance_proposal_updateNetParam_minEnact:
'governance_proposal_updateNetParam_minEnact',
governance_proposal_updateNetParam_maxEnact:
'governance_proposal_updateNetParam_maxEnact',
governance_proposal_freeform_minClose:
'governance_proposal_freeform_minClose',
governance_proposal_freeform_maxClose:
'governance_proposal_freeform_maxClose',
governance_proposal_updateMarket_requiredParticipation:
'governance_proposal_updateMarket_requiredParticipation',
governance_proposal_updateMarket_minProposerBalance:
'governance_proposal_updateMarket_minProposerBalance',
governance_proposal_market_requiredMajority:
'governance_proposal_market_requiredMajority',
governance_proposal_market_requiredParticipation:
'governance_proposal_market_requiredParticipation',
governance_proposal_market_minProposerBalance:
'governance_proposal_market_minProposerBalance',
governance_proposal_asset_requiredMajority:
'governance_proposal_asset_requiredMajority',
governance_proposal_asset_requiredParticipation:
'governance_proposal_asset_requiredParticipation',
governance_proposal_asset_minProposerBalance:
'governance_proposal_asset_minProposerBalance',
governance_proposal_updateNetParam_requiredMajority:
'governance_proposal_updateNetParam_requiredMajority',
governance_proposal_updateNetParam_requiredParticipation:
'governance_proposal_updateNetParam_requiredParticipation',
governance_proposal_updateNetParam_minProposerBalance:
'governance_proposal_updateNetParam_minProposerBalance',
governance_proposal_freeform_requiredParticipation:
'governance_proposal_freeform_requiredParticipation',
governance_proposal_freeform_requiredMajority:
'governance_proposal_freeform_requiredMajority',
governance_proposal_freeform_minProposerBalance:
'governance_proposal_freeform_minProposerBalance',
validators_delegation_minAmount: 'validators_delegation_minAmount',
spam_protection_proposal_min_tokens: 'spam_protection_proposal_min_tokens',
market_liquidity_stakeToCcySiskas: 'market_liquidity_stakeToCcySiskas',
} as const;
type Params = typeof NetworkParams;
export type NetworkParamsKey = Params[keyof Params];
type Result = {
[key in keyof Params]: string;
};
export const useNetworkParams = <T extends NetworkParamsKey[]>(params?: T) => {
const { data, loading, error } = useQuery<NetworkParamsResponse, never>(
NETWORK_PARAMETERS_QUERY
);
const foundParams = data?.networkParameters?.filter((p) => param === p.key);
const paramsObj = useMemo(() => {
if (!data?.networkParameters) return null;
return data.networkParameters
.map((p) => ({
...p,
key: p.key.split('.').join('_'),
}))
.filter((p) => {
if (params === undefined || params.length === 0) return true;
if (params.includes(p.key as NetworkParamsKey)) return true;
return false;
})
.reduce((obj, p) => {
obj[p.key] = p.value;
return obj;
}, {} as { [key: string]: string });
}, [data, params]);
return {
data: foundParams ? foundParams.map((f) => f.value) : null,
params: paramsObj as Pick<Result, T[number]>,
loading,
error,
};
};
export const useNetworkParams = (params: string[]) => {
const { data, loading, error } = useQuery<NetworkParams, never>(
NETWORK_PARAMETERS_QUERY
);
const foundParams = data?.networkParameters
?.filter((p) => params.includes(p.key))
.sort((a, b) => params.indexOf(a.key) - params.indexOf(b.key));
export const useNetworkParam = (param: NetworkParamsKey) => {
const { data, loading, error } = useQuery(NETWORK_PARAMETER_QUERY, {
variables: {
key: param,
},
});
return {
data: foundParams ? foundParams.map((f) => f.value) : null,
param: data?.networkParameter ? data.networkParameter.value : null,
loading,
error,
};