diff --git a/apps/token/src/routes/governance/Proposal.graphql b/apps/token/src/routes/governance/Proposal.graphql index f792a2c04..9978dbfae 100644 --- a/apps/token/src/routes/governance/Proposal.graphql +++ b/apps/token/src/routes/governance/Proposal.graphql @@ -49,6 +49,15 @@ fragment ProposalFields on Proposal { value } } + ... on UpdateAsset { + quantum + source { + ... on UpdateERC20 { + lifetimeLimit + withdrawThreshold + } + } + } } } votes { diff --git a/apps/token/src/routes/governance/__generated__/ProposalFields.ts b/apps/token/src/routes/governance/__generated__/ProposalFields.ts index 11c05b3d8..4fd060bf0 100644 --- a/apps/token/src/routes/governance/__generated__/ProposalFields.ts +++ b/apps/token/src/routes/governance/__generated__/ProposalFields.ts @@ -33,8 +33,8 @@ export interface ProposalFields_party { id: string; } -export interface ProposalFields_terms_change_UpdateAsset { - __typename: "UpdateAsset" | "NewFreeform"; +export interface ProposalFields_terms_change_NewFreeform { + __typename: "NewFreeform"; } export interface ProposalFields_terms_change_NewMarket_instrument_futureProduct_settlementAsset { @@ -133,7 +133,33 @@ export interface ProposalFields_terms_change_UpdateNetworkParameter { networkParameter: ProposalFields_terms_change_UpdateNetworkParameter_networkParameter; } -export type ProposalFields_terms_change = ProposalFields_terms_change_UpdateAsset | ProposalFields_terms_change_NewMarket | ProposalFields_terms_change_UpdateMarket | ProposalFields_terms_change_NewAsset | ProposalFields_terms_change_UpdateNetworkParameter; +export interface ProposalFields_terms_change_UpdateAsset_source { + __typename: "UpdateERC20"; + /** + * The lifetime limits deposit per address + * Note: this is a temporary measure for alpha mainnet + */ + lifetimeLimit: string; + /** + * The maximum allowed per withdrawal + * Note: this is a temporary measure for alpha mainnet + */ + withdrawThreshold: string; +} + +export interface ProposalFields_terms_change_UpdateAsset { + __typename: "UpdateAsset"; + /** + * The minimum economically meaningful amount of this specific asset + */ + quantum: string; + /** + * The source of the updated asset + */ + source: ProposalFields_terms_change_UpdateAsset_source; +} + +export type ProposalFields_terms_change = ProposalFields_terms_change_NewFreeform | ProposalFields_terms_change_NewMarket | ProposalFields_terms_change_UpdateMarket | ProposalFields_terms_change_NewAsset | ProposalFields_terms_change_UpdateNetworkParameter | ProposalFields_terms_change_UpdateAsset; export interface ProposalFields_terms { __typename: "ProposalTerms"; diff --git a/apps/token/src/routes/governance/__generated___/Proposal.ts b/apps/token/src/routes/governance/__generated___/Proposal.ts index d4ecf5980..e4cd52cc7 100644 --- a/apps/token/src/routes/governance/__generated___/Proposal.ts +++ b/apps/token/src/routes/governance/__generated___/Proposal.ts @@ -3,19 +3,19 @@ import { Schema as Types } from '@vegaprotocol/types'; import { gql } from '@apollo/client'; import * as Apollo from '@apollo/client'; const defaultOptions = {} as const; -export type ProposalFieldsFragment = { __typename?: 'Proposal', id?: string | null, reference: string, state: Types.ProposalState, datetime: string, rejectionReason?: Types.ProposalRejectionReason | null, errorDetails?: string | null, party: { __typename?: 'Party', id: string }, terms: { __typename?: 'ProposalTerms', closingDatetime: string, enactmentDatetime?: string | null, change: { __typename: 'NewAsset', name: string, symbol: string, source: { __typename: 'BuiltinAsset', maxFaucetAmountMint: string } | { __typename: 'ERC20', contractAddress: string } } | { __typename?: 'NewFreeform' } | { __typename?: 'NewMarket', decimalPlaces: number, metadata?: Array | null, instrument: { __typename?: 'InstrumentConfiguration', name: string, code: string, futureProduct?: { __typename?: 'FutureProduct', settlementAsset: { __typename?: 'Asset', symbol: string } } | null } } | { __typename?: 'UpdateAsset' } | { __typename?: 'UpdateMarket', marketId: string } | { __typename?: 'UpdateNetworkParameter', networkParameter: { __typename?: 'NetworkParameter', key: string, value: string } } }, votes: { __typename?: 'ProposalVotes', yes: { __typename?: 'ProposalVoteSide', totalTokens: string, totalNumber: string, votes?: Array<{ __typename?: 'Vote', value: Types.VoteValue, datetime: string, party: { __typename?: 'Party', id: string, stake: { __typename?: 'PartyStake', currentStakeAvailable: string } } }> | null }, no: { __typename?: 'ProposalVoteSide', totalTokens: string, totalNumber: string, votes?: Array<{ __typename?: 'Vote', value: Types.VoteValue, datetime: string, party: { __typename?: 'Party', id: string, stake: { __typename?: 'PartyStake', currentStakeAvailable: string } } }> | null } } }; +export type ProposalFieldsFragment = { __typename?: 'Proposal', id?: string | null, reference: string, state: Types.ProposalState, datetime: string, rejectionReason?: Types.ProposalRejectionReason | null, errorDetails?: string | null, party: { __typename?: 'Party', id: string }, terms: { __typename?: 'ProposalTerms', closingDatetime: string, enactmentDatetime?: string | null, change: { __typename: 'NewAsset', name: string, symbol: string, source: { __typename: 'BuiltinAsset', maxFaucetAmountMint: string } | { __typename: 'ERC20', contractAddress: string } } | { __typename?: 'NewFreeform' } | { __typename?: 'NewMarket', decimalPlaces: number, metadata?: Array | null, instrument: { __typename?: 'InstrumentConfiguration', name: string, code: string, futureProduct?: { __typename?: 'FutureProduct', settlementAsset: { __typename?: 'Asset', symbol: string } } | null } } | { __typename?: 'UpdateAsset', quantum: string, source: { __typename?: 'UpdateERC20', lifetimeLimit: string, withdrawThreshold: string } } | { __typename?: 'UpdateMarket', marketId: string } | { __typename?: 'UpdateNetworkParameter', networkParameter: { __typename?: 'NetworkParameter', key: string, value: string } } }, votes: { __typename?: 'ProposalVotes', yes: { __typename?: 'ProposalVoteSide', totalTokens: string, totalNumber: string, votes?: Array<{ __typename?: 'Vote', value: Types.VoteValue, datetime: string, party: { __typename?: 'Party', id: string, stake: { __typename?: 'PartyStake', currentStakeAvailable: string } } }> | null }, no: { __typename?: 'ProposalVoteSide', totalTokens: string, totalNumber: string, votes?: Array<{ __typename?: 'Vote', value: Types.VoteValue, datetime: string, party: { __typename?: 'Party', id: string, stake: { __typename?: 'PartyStake', currentStakeAvailable: string } } }> | null } } }; export type ProposalQueryVariables = Types.Exact<{ proposalId: Types.Scalars['ID']; }>; -export type ProposalQuery = { __typename?: 'Query', proposal?: { __typename?: 'Proposal', id?: string | null, reference: string, state: Types.ProposalState, datetime: string, rejectionReason?: Types.ProposalRejectionReason | null, errorDetails?: string | null, party: { __typename?: 'Party', id: string }, terms: { __typename?: 'ProposalTerms', closingDatetime: string, enactmentDatetime?: string | null, change: { __typename: 'NewAsset', name: string, symbol: string, source: { __typename: 'BuiltinAsset', maxFaucetAmountMint: string } | { __typename: 'ERC20', contractAddress: string } } | { __typename?: 'NewFreeform' } | { __typename?: 'NewMarket', decimalPlaces: number, metadata?: Array | null, instrument: { __typename?: 'InstrumentConfiguration', name: string, code: string, futureProduct?: { __typename?: 'FutureProduct', settlementAsset: { __typename?: 'Asset', symbol: string } } | null } } | { __typename?: 'UpdateAsset' } | { __typename?: 'UpdateMarket', marketId: string } | { __typename?: 'UpdateNetworkParameter', networkParameter: { __typename?: 'NetworkParameter', key: string, value: string } } }, votes: { __typename?: 'ProposalVotes', yes: { __typename?: 'ProposalVoteSide', totalTokens: string, totalNumber: string, votes?: Array<{ __typename?: 'Vote', value: Types.VoteValue, datetime: string, party: { __typename?: 'Party', id: string, stake: { __typename?: 'PartyStake', currentStakeAvailable: string } } }> | null }, no: { __typename?: 'ProposalVoteSide', totalTokens: string, totalNumber: string, votes?: Array<{ __typename?: 'Vote', value: Types.VoteValue, datetime: string, party: { __typename?: 'Party', id: string, stake: { __typename?: 'PartyStake', currentStakeAvailable: string } } }> | null } } } | null }; +export type ProposalQuery = { __typename?: 'Query', proposal?: { __typename?: 'Proposal', id?: string | null, reference: string, state: Types.ProposalState, datetime: string, rejectionReason?: Types.ProposalRejectionReason | null, errorDetails?: string | null, party: { __typename?: 'Party', id: string }, terms: { __typename?: 'ProposalTerms', closingDatetime: string, enactmentDatetime?: string | null, change: { __typename: 'NewAsset', name: string, symbol: string, source: { __typename: 'BuiltinAsset', maxFaucetAmountMint: string } | { __typename: 'ERC20', contractAddress: string } } | { __typename?: 'NewFreeform' } | { __typename?: 'NewMarket', decimalPlaces: number, metadata?: Array | null, instrument: { __typename?: 'InstrumentConfiguration', name: string, code: string, futureProduct?: { __typename?: 'FutureProduct', settlementAsset: { __typename?: 'Asset', symbol: string } } | null } } | { __typename?: 'UpdateAsset', quantum: string, source: { __typename?: 'UpdateERC20', lifetimeLimit: string, withdrawThreshold: string } } | { __typename?: 'UpdateMarket', marketId: string } | { __typename?: 'UpdateNetworkParameter', networkParameter: { __typename?: 'NetworkParameter', key: string, value: string } } }, votes: { __typename?: 'ProposalVotes', yes: { __typename?: 'ProposalVoteSide', totalTokens: string, totalNumber: string, votes?: Array<{ __typename?: 'Vote', value: Types.VoteValue, datetime: string, party: { __typename?: 'Party', id: string, stake: { __typename?: 'PartyStake', currentStakeAvailable: string } } }> | null }, no: { __typename?: 'ProposalVoteSide', totalTokens: string, totalNumber: string, votes?: Array<{ __typename?: 'Vote', value: Types.VoteValue, datetime: string, party: { __typename?: 'Party', id: string, stake: { __typename?: 'PartyStake', currentStakeAvailable: string } } }> | null } } } | null }; export type ProposalsQueryVariables = Types.Exact<{ [key: string]: never; }>; -export type ProposalsQuery = { __typename?: 'Query', proposals?: Array<{ __typename?: 'Proposal', id?: string | null, reference: string, state: Types.ProposalState, datetime: string, rejectionReason?: Types.ProposalRejectionReason | null, errorDetails?: string | null, party: { __typename?: 'Party', id: string }, terms: { __typename?: 'ProposalTerms', closingDatetime: string, enactmentDatetime?: string | null, change: { __typename: 'NewAsset', name: string, symbol: string, source: { __typename: 'BuiltinAsset', maxFaucetAmountMint: string } | { __typename: 'ERC20', contractAddress: string } } | { __typename?: 'NewFreeform' } | { __typename?: 'NewMarket', decimalPlaces: number, metadata?: Array | null, instrument: { __typename?: 'InstrumentConfiguration', name: string, code: string, futureProduct?: { __typename?: 'FutureProduct', settlementAsset: { __typename?: 'Asset', symbol: string } } | null } } | { __typename?: 'UpdateAsset' } | { __typename?: 'UpdateMarket', marketId: string } | { __typename?: 'UpdateNetworkParameter', networkParameter: { __typename?: 'NetworkParameter', key: string, value: string } } }, votes: { __typename?: 'ProposalVotes', yes: { __typename?: 'ProposalVoteSide', totalTokens: string, totalNumber: string, votes?: Array<{ __typename?: 'Vote', value: Types.VoteValue, datetime: string, party: { __typename?: 'Party', id: string, stake: { __typename?: 'PartyStake', currentStakeAvailable: string } } }> | null }, no: { __typename?: 'ProposalVoteSide', totalTokens: string, totalNumber: string, votes?: Array<{ __typename?: 'Vote', value: Types.VoteValue, datetime: string, party: { __typename?: 'Party', id: string, stake: { __typename?: 'PartyStake', currentStakeAvailable: string } } }> | null } } }> | null }; +export type ProposalsQuery = { __typename?: 'Query', proposals?: Array<{ __typename?: 'Proposal', id?: string | null, reference: string, state: Types.ProposalState, datetime: string, rejectionReason?: Types.ProposalRejectionReason | null, errorDetails?: string | null, party: { __typename?: 'Party', id: string }, terms: { __typename?: 'ProposalTerms', closingDatetime: string, enactmentDatetime?: string | null, change: { __typename: 'NewAsset', name: string, symbol: string, source: { __typename: 'BuiltinAsset', maxFaucetAmountMint: string } | { __typename: 'ERC20', contractAddress: string } } | { __typename?: 'NewFreeform' } | { __typename?: 'NewMarket', decimalPlaces: number, metadata?: Array | null, instrument: { __typename?: 'InstrumentConfiguration', name: string, code: string, futureProduct?: { __typename?: 'FutureProduct', settlementAsset: { __typename?: 'Asset', symbol: string } } | null } } | { __typename?: 'UpdateAsset', quantum: string, source: { __typename?: 'UpdateERC20', lifetimeLimit: string, withdrawThreshold: string } } | { __typename?: 'UpdateMarket', marketId: string } | { __typename?: 'UpdateNetworkParameter', networkParameter: { __typename?: 'NetworkParameter', key: string, value: string } } }, votes: { __typename?: 'ProposalVotes', yes: { __typename?: 'ProposalVoteSide', totalTokens: string, totalNumber: string, votes?: Array<{ __typename?: 'Vote', value: Types.VoteValue, datetime: string, party: { __typename?: 'Party', id: string, stake: { __typename?: 'PartyStake', currentStakeAvailable: string } } }> | null }, no: { __typename?: 'ProposalVoteSide', totalTokens: string, totalNumber: string, votes?: Array<{ __typename?: 'Vote', value: Types.VoteValue, datetime: string, party: { __typename?: 'Party', id: string, stake: { __typename?: 'PartyStake', currentStakeAvailable: string } } }> | null } } }> | null }; export const ProposalFieldsFragmentDoc = gql` fragment ProposalFields on Proposal { @@ -69,6 +69,15 @@ export const ProposalFieldsFragmentDoc = gql` value } } + ... on UpdateAsset { + quantum + source { + ... on UpdateERC20 { + lifetimeLimit + withdrawThreshold + } + } + } } } votes { diff --git a/apps/token/src/routes/governance/components/proposal-detail-header/proposal-header.spec.tsx b/apps/token/src/routes/governance/components/proposal-detail-header/proposal-header.spec.tsx index 13e4a46a5..c719de672 100644 --- a/apps/token/src/routes/governance/components/proposal-detail-header/proposal-header.spec.tsx +++ b/apps/token/src/routes/governance/components/proposal-detail-header/proposal-header.spec.tsx @@ -1,9 +1,9 @@ import { render, screen } from '@testing-library/react'; import { generateProposal } from '../../test-helpers/generate-proposals'; import { ProposalHeader } from './proposal-header'; -import type { Proposal_proposal } from '@vegaprotocol/governance'; +import type { ProposalFields } from '../../__generated__/ProposalFields'; -const renderComponent = (proposal: Proposal_proposal) => ( +const renderComponent = (proposal: ProposalFields) => ( ); @@ -234,6 +234,23 @@ describe('Proposal header', () => { ); }); + it('Renders asset change proposal header', () => { + render( + renderComponent( + generateProposal({ + terms: { + change: { + __typename: 'UpdateAsset', + }, + }, + }) + ) + ); + expect(screen.getByTestId('proposal-details')).toHaveTextContent( + 'Update asset' + ); + }); + it("Renders unknown proposal if it's a different proposal type", () => { render( renderComponent( diff --git a/apps/token/src/routes/governance/components/proposal-detail-header/proposal-header.tsx b/apps/token/src/routes/governance/components/proposal-detail-header/proposal-header.tsx index 18d0c786d..60eb205ce 100644 --- a/apps/token/src/routes/governance/components/proposal-detail-header/proposal-header.tsx +++ b/apps/token/src/routes/governance/components/proposal-detail-header/proposal-header.tsx @@ -76,6 +76,10 @@ export const ProposalHeader = ({ proposal }: { proposal: ProposalFields }) => { details = `${t('FreeformProposal')}: ${proposal.id}`; break; } + case 'UpdateAsset': { + details = `${t('Update asset')}`; + break; + } } return ( diff --git a/apps/token/src/routes/governance/proposal-fragment.ts b/apps/token/src/routes/governance/proposal-fragment.ts index a0e44ef87..b35dc9a9d 100644 --- a/apps/token/src/routes/governance/proposal-fragment.ts +++ b/apps/token/src/routes/governance/proposal-fragment.ts @@ -52,6 +52,15 @@ export const PROPOSAL_FRAGMENT = gql` value } } + ... on UpdateAsset { + quantum + source { + ... on UpdateERC20 { + lifetimeLimit + withdrawThreshold + } + } + } } } votes { diff --git a/apps/token/src/routes/governance/proposal/__generated__/Proposal.ts b/apps/token/src/routes/governance/proposal/__generated__/Proposal.ts index a5da6a4a6..1202fecf9 100644 --- a/apps/token/src/routes/governance/proposal/__generated__/Proposal.ts +++ b/apps/token/src/routes/governance/proposal/__generated__/Proposal.ts @@ -33,8 +33,8 @@ export interface Proposal_proposal_party { id: string; } -export interface Proposal_proposal_terms_change_UpdateAsset { - __typename: "UpdateAsset" | "NewFreeform"; +export interface Proposal_proposal_terms_change_NewFreeform { + __typename: "NewFreeform"; } export interface Proposal_proposal_terms_change_NewMarket_instrument_futureProduct_settlementAsset { @@ -133,7 +133,33 @@ export interface Proposal_proposal_terms_change_UpdateNetworkParameter { networkParameter: Proposal_proposal_terms_change_UpdateNetworkParameter_networkParameter; } -export type Proposal_proposal_terms_change = Proposal_proposal_terms_change_UpdateAsset | Proposal_proposal_terms_change_NewMarket | Proposal_proposal_terms_change_UpdateMarket | Proposal_proposal_terms_change_NewAsset | Proposal_proposal_terms_change_UpdateNetworkParameter; +export interface Proposal_proposal_terms_change_UpdateAsset_source { + __typename: "UpdateERC20"; + /** + * The lifetime limits deposit per address + * Note: this is a temporary measure for alpha mainnet + */ + lifetimeLimit: string; + /** + * The maximum allowed per withdrawal + * Note: this is a temporary measure for alpha mainnet + */ + withdrawThreshold: string; +} + +export interface Proposal_proposal_terms_change_UpdateAsset { + __typename: "UpdateAsset"; + /** + * The minimum economically meaningful amount of this specific asset + */ + quantum: string; + /** + * The source of the updated asset + */ + source: Proposal_proposal_terms_change_UpdateAsset_source; +} + +export type Proposal_proposal_terms_change = Proposal_proposal_terms_change_NewFreeform | Proposal_proposal_terms_change_NewMarket | Proposal_proposal_terms_change_UpdateMarket | Proposal_proposal_terms_change_NewAsset | Proposal_proposal_terms_change_UpdateNetworkParameter | Proposal_proposal_terms_change_UpdateAsset; export interface Proposal_proposal_terms { __typename: "ProposalTerms"; diff --git a/apps/token/src/routes/governance/proposals/__generated__/Proposals.ts b/apps/token/src/routes/governance/proposals/__generated__/Proposals.ts index 7dd31f3d8..1c272ac94 100644 --- a/apps/token/src/routes/governance/proposals/__generated__/Proposals.ts +++ b/apps/token/src/routes/governance/proposals/__generated__/Proposals.ts @@ -33,8 +33,8 @@ export interface Proposals_proposalsConnection_edges_node_party { id: string; } -export interface Proposals_proposalsConnection_edges_node_terms_change_UpdateAsset { - __typename: "UpdateAsset" | "NewFreeform"; +export interface Proposals_proposalsConnection_edges_node_terms_change_NewFreeform { + __typename: "NewFreeform"; } export interface Proposals_proposalsConnection_edges_node_terms_change_NewMarket_instrument_futureProduct_settlementAsset { @@ -133,7 +133,33 @@ export interface Proposals_proposalsConnection_edges_node_terms_change_UpdateNet networkParameter: Proposals_proposalsConnection_edges_node_terms_change_UpdateNetworkParameter_networkParameter; } -export type Proposals_proposalsConnection_edges_node_terms_change = Proposals_proposalsConnection_edges_node_terms_change_UpdateAsset | Proposals_proposalsConnection_edges_node_terms_change_NewMarket | Proposals_proposalsConnection_edges_node_terms_change_UpdateMarket | Proposals_proposalsConnection_edges_node_terms_change_NewAsset | Proposals_proposalsConnection_edges_node_terms_change_UpdateNetworkParameter; +export interface Proposals_proposalsConnection_edges_node_terms_change_UpdateAsset_source { + __typename: "UpdateERC20"; + /** + * The lifetime limits deposit per address + * Note: this is a temporary measure for alpha mainnet + */ + lifetimeLimit: string; + /** + * The maximum allowed per withdrawal + * Note: this is a temporary measure for alpha mainnet + */ + withdrawThreshold: string; +} + +export interface Proposals_proposalsConnection_edges_node_terms_change_UpdateAsset { + __typename: "UpdateAsset"; + /** + * The minimum economically meaningful amount of this specific asset + */ + quantum: string; + /** + * The source of the updated asset + */ + source: Proposals_proposalsConnection_edges_node_terms_change_UpdateAsset_source; +} + +export type Proposals_proposalsConnection_edges_node_terms_change = Proposals_proposalsConnection_edges_node_terms_change_NewFreeform | Proposals_proposalsConnection_edges_node_terms_change_NewMarket | Proposals_proposalsConnection_edges_node_terms_change_UpdateMarket | Proposals_proposalsConnection_edges_node_terms_change_NewAsset | Proposals_proposalsConnection_edges_node_terms_change_UpdateNetworkParameter | Proposals_proposalsConnection_edges_node_terms_change_UpdateAsset; export interface Proposals_proposalsConnection_edges_node_terms { __typename: "ProposalTerms";