feat(governance): successor market proposal details (#4393)
This commit is contained in:
parent
c3157de146
commit
278eb01c2f
@ -25,3 +25,5 @@ NX_TENDERMINT_WEBSOCKET_URL=wss://tm.n01.stagnet1.vega.xyz/websocket
|
|||||||
CYPRESS_FAIRGROUND=false
|
CYPRESS_FAIRGROUND=false
|
||||||
LC_ALL="en_US.UTF-8"
|
LC_ALL="en_US.UTF-8"
|
||||||
|
|
||||||
|
# Cosmic elevator flags
|
||||||
|
NX_SUCCESSOR_MARKETS=true
|
@ -25,3 +25,5 @@ NX_TENDERMINT_WEBSOCKET_URL=wss://localhost:26617/websocket
|
|||||||
#Test configuration variables
|
#Test configuration variables
|
||||||
CYPRESS_FAIRGROUND=false
|
CYPRESS_FAIRGROUND=false
|
||||||
|
|
||||||
|
# Cosmic elevator flags
|
||||||
|
NX_SUCCESSOR_MARKETS=false
|
@ -16,3 +16,6 @@ NX_SENTRY_DSN=https://4b8c8a8ba07742648aa4dfe1b8d17e40@o286262.ingest.sentry.io/
|
|||||||
|
|
||||||
NX_TENDERMINT_URL=https://tm.be.devnet1.vega.xyz/
|
NX_TENDERMINT_URL=https://tm.be.devnet1.vega.xyz/
|
||||||
NX_TENDERMINT_WEBSOCKET_URL=wss://be.devnet1.vega.xyz/websocket
|
NX_TENDERMINT_WEBSOCKET_URL=wss://be.devnet1.vega.xyz/websocket
|
||||||
|
|
||||||
|
# Cosmic elevator flags
|
||||||
|
NX_SUCCESSOR_MARKETS=true
|
@ -17,3 +17,6 @@ NX_VEGA_REST_URL=https://api.vega.community/api/v2/
|
|||||||
|
|
||||||
NX_TENDERMINT_URL=https://be.vega.community
|
NX_TENDERMINT_URL=https://be.vega.community
|
||||||
NX_TENDERMINT_WEBSOCKET_URL=wss://be.vega.community/websocket
|
NX_TENDERMINT_WEBSOCKET_URL=wss://be.vega.community/websocket
|
||||||
|
|
||||||
|
# Cosmic elevator flags
|
||||||
|
NX_SUCCESSOR_MARKETS=false
|
@ -16,3 +16,6 @@ NX_VEGA_REST_URL=https://api.mainnet-mirror.vega.rocks/api/v2/
|
|||||||
|
|
||||||
NX_TENDERMINT_URL=https://be.mainnet-mirror.vega.rocks
|
NX_TENDERMINT_URL=https://be.mainnet-mirror.vega.rocks
|
||||||
NX_TENDERMINT_WEBSOCKET_URL=wss://be.mainnet-mirror.vega.rocks/websocket
|
NX_TENDERMINT_WEBSOCKET_URL=wss://be.mainnet-mirror.vega.rocks/websocket
|
||||||
|
|
||||||
|
# Cosmic elevator flags
|
||||||
|
NX_SUCCESSOR_MARKETS=false
|
@ -12,3 +12,6 @@ NX_VEGA_REST_URL=https://api.n00.stagnet1.vega.xyz/api/v2/
|
|||||||
|
|
||||||
NX_TENDERMINT_URL=https://tm.n01.stagnet1.vega.rocks
|
NX_TENDERMINT_URL=https://tm.n01.stagnet1.vega.rocks
|
||||||
NX_TENDERMINT_WEBSOCKET_URL=wss://tm.n01.stagnet1.vega.xyz/websocket
|
NX_TENDERMINT_WEBSOCKET_URL=wss://tm.n01.stagnet1.vega.xyz/websocket
|
||||||
|
|
||||||
|
# Cosmic elevator flags
|
||||||
|
NX_SUCCESSOR_MARKETS=true
|
@ -17,3 +17,6 @@ NX_SENTRY_DSN=https://4b8c8a8ba07742648aa4dfe1b8d17e40@o286262.ingest.sentry.io/
|
|||||||
|
|
||||||
NX_TENDERMINT_URL=https://tm.be.testnet.vega.xyz
|
NX_TENDERMINT_URL=https://tm.be.testnet.vega.xyz
|
||||||
NX_TENDERMINT_WEBSOCKET_URL=wss://be.testnet.vega.xyz/websocket
|
NX_TENDERMINT_WEBSOCKET_URL=wss://be.testnet.vega.xyz/websocket
|
||||||
|
|
||||||
|
# Cosmic elevator flags
|
||||||
|
NX_SUCCESSOR_MARKETS=true
|
@ -14,3 +14,6 @@ NX_SENTRY_DSN=https://4b8c8a8ba07742648aa4dfe1b8d17e40@o286262.ingest.sentry.io/
|
|||||||
|
|
||||||
NX_TENDERMINT_URL=https://tm.be.validators-testnet.vega.rocks
|
NX_TENDERMINT_URL=https://tm.be.validators-testnet.vega.rocks
|
||||||
NX_TENDERMINT_WEBSOCKET_URL=wss://be.validators-testnet.vega.
|
NX_TENDERMINT_WEBSOCKET_URL=wss://be.validators-testnet.vega.
|
||||||
|
|
||||||
|
# Cosmic elevator flags
|
||||||
|
NX_SUCCESSOR_MARKETS=false
|
@ -22,6 +22,16 @@ import {
|
|||||||
} from '../../test-helpers/mocks';
|
} from '../../test-helpers/mocks';
|
||||||
import type { ProposalQuery } from '../../proposal/__generated__/Proposal';
|
import type { ProposalQuery } from '../../proposal/__generated__/Proposal';
|
||||||
import type { MockedResponse } from '@apollo/client/testing';
|
import type { MockedResponse } from '@apollo/client/testing';
|
||||||
|
import { FLAGS } from '@vegaprotocol/environment';
|
||||||
|
import { BrowserRouter } from 'react-router-dom';
|
||||||
|
|
||||||
|
jest.mock('@vegaprotocol/proposals', () => ({
|
||||||
|
...jest.requireActual('@vegaprotocol/proposals'),
|
||||||
|
useSuccessorMarketProposalDetails: () => ({
|
||||||
|
code: 'PARENT_CODE',
|
||||||
|
parentMarketId: 'PARENT_ID',
|
||||||
|
}),
|
||||||
|
}));
|
||||||
|
|
||||||
const renderComponent = (
|
const renderComponent = (
|
||||||
proposal: ProposalQuery['proposal'],
|
proposal: ProposalQuery['proposal'],
|
||||||
@ -30,6 +40,7 @@ const renderComponent = (
|
|||||||
) =>
|
) =>
|
||||||
render(
|
render(
|
||||||
<AppStateProvider>
|
<AppStateProvider>
|
||||||
|
<BrowserRouter>
|
||||||
<MockedProvider mocks={mocks}>
|
<MockedProvider mocks={mocks}>
|
||||||
<VegaWalletContext.Provider value={mockWalletContext}>
|
<VegaWalletContext.Provider value={mockWalletContext}>
|
||||||
<ProposalHeader
|
<ProposalHeader
|
||||||
@ -39,11 +50,17 @@ const renderComponent = (
|
|||||||
/>
|
/>
|
||||||
</VegaWalletContext.Provider>
|
</VegaWalletContext.Provider>
|
||||||
</MockedProvider>
|
</MockedProvider>
|
||||||
|
</BrowserRouter>
|
||||||
</AppStateProvider>
|
</AppStateProvider>
|
||||||
);
|
);
|
||||||
|
|
||||||
describe('Proposal header', () => {
|
describe('Proposal header', () => {
|
||||||
|
afterAll(() => {
|
||||||
|
jest.clearAllMocks();
|
||||||
|
});
|
||||||
it('Renders New market proposal', () => {
|
it('Renders New market proposal', () => {
|
||||||
|
const mockedFlags = jest.mocked(FLAGS);
|
||||||
|
mockedFlags.SUCCESSOR_MARKETS = true;
|
||||||
renderComponent(
|
renderComponent(
|
||||||
generateProposal({
|
generateProposal({
|
||||||
rationale: {
|
rationale: {
|
||||||
@ -76,6 +93,9 @@ describe('Proposal header', () => {
|
|||||||
expect(screen.getByTestId('proposal-details')).toHaveTextContent(
|
expect(screen.getByTestId('proposal-details')).toHaveTextContent(
|
||||||
'tGBP settled future.'
|
'tGBP settled future.'
|
||||||
);
|
);
|
||||||
|
expect(screen.getByTestId('proposal-successor-info')).toHaveTextContent(
|
||||||
|
'PARENT_CODE'
|
||||||
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('Renders Update market proposal', () => {
|
it('Renders Update market proposal', () => {
|
||||||
|
@ -11,6 +11,10 @@ import { ProposalInfoLabel } from '../proposal-info-label';
|
|||||||
import { useUserVote } from '../vote-details/use-user-vote';
|
import { useUserVote } from '../vote-details/use-user-vote';
|
||||||
import { ProposalVotingStatus } from '../proposal-voting-status';
|
import { ProposalVotingStatus } from '../proposal-voting-status';
|
||||||
import type { NetworkParamsResult } from '@vegaprotocol/network-parameters';
|
import type { NetworkParamsResult } from '@vegaprotocol/network-parameters';
|
||||||
|
import { useSuccessorMarketProposalDetails } from '@vegaprotocol/proposals';
|
||||||
|
import { FLAGS } from '@vegaprotocol/environment';
|
||||||
|
import Routes from '../../../routes';
|
||||||
|
import { Link } from 'react-router-dom';
|
||||||
|
|
||||||
export const ProposalHeader = ({
|
export const ProposalHeader = ({
|
||||||
proposal,
|
proposal,
|
||||||
@ -39,6 +43,9 @@ export const ProposalHeader = ({
|
|||||||
fallbackTitle = t('NewMarketProposal');
|
fallbackTitle = t('NewMarketProposal');
|
||||||
details = (
|
details = (
|
||||||
<>
|
<>
|
||||||
|
{FLAGS.SUCCESSOR_MARKETS && (
|
||||||
|
<SuccessorCode proposalId={proposal?.id} />
|
||||||
|
)}
|
||||||
<span>
|
<span>
|
||||||
{t('Code')}: {change.instrument.code}.
|
{t('Code')}: {change.instrument.code}.
|
||||||
</span>{' '}
|
</span>{' '}
|
||||||
@ -181,3 +188,20 @@ export const ProposalHeader = ({
|
|||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const SuccessorCode = ({ proposalId }: { proposalId?: string | null }) => {
|
||||||
|
const { t } = useTranslation();
|
||||||
|
const successor = useSuccessorMarketProposalDetails(proposalId);
|
||||||
|
|
||||||
|
return successor.parentMarketId || successor.code ? (
|
||||||
|
<span className="block" data-testid="proposal-successor-info">
|
||||||
|
{t('Successor market to')}:{' '}
|
||||||
|
<Link
|
||||||
|
to={`${Routes.PROPOSALS}/${successor.parentMarketId}`}
|
||||||
|
className="hover:underline"
|
||||||
|
>
|
||||||
|
{successor.code || successor.parentMarketId}
|
||||||
|
</Link>
|
||||||
|
</span>
|
||||||
|
) : null;
|
||||||
|
};
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
import { MarketTradingModeMapping } from '@vegaprotocol/types';
|
import { MarketTradingModeMapping } from '@vegaprotocol/types';
|
||||||
import { MarketState } from '@vegaprotocol/types';
|
import { MarketState } from '@vegaprotocol/types';
|
||||||
|
import compact from 'lodash/compact';
|
||||||
|
|
||||||
const accordionContent = 'accordion-content';
|
const accordionContent = 'accordion-content';
|
||||||
const blockExplorerLink = 'block-explorer-link';
|
const blockExplorerLink = 'block-explorer-link';
|
||||||
@ -66,20 +67,24 @@ describe('market info is displayed', { tags: '@smoke' }, () => {
|
|||||||
// 6002-MDET-201
|
// 6002-MDET-201
|
||||||
cy.getByTestId(marketTitle).contains('Key details').click();
|
cy.getByTestId(marketTitle).contains('Key details').click();
|
||||||
|
|
||||||
validateMarketDataRow(0, 'Name', 'BTCUSD Monthly (30 Jun 2022)');
|
const rows: [string, string][] = compact([
|
||||||
validateMarketDataRow(1, 'Market ID', 'market-0');
|
['Name', 'BTCUSD Monthly (30 Jun 2022)'],
|
||||||
|
['Market ID', 'market-0'],
|
||||||
|
Cypress.env('NX_SUCCESSOR_MARKETS') && ['Parent Market ID', 'PARENT-A'],
|
||||||
|
Cypress.env('NX_SUCCESSOR_MARKETS') && [
|
||||||
|
'Insurance Pool Fraction',
|
||||||
|
'0.75',
|
||||||
|
],
|
||||||
|
['Trading Mode', MarketTradingModeMapping.TRADING_MODE_CONTINUOUS],
|
||||||
|
['Market Decimal Places', '5'],
|
||||||
|
['Position Decimal Places', '0'],
|
||||||
|
['Settlement Asset Decimal Places', '5'],
|
||||||
|
]);
|
||||||
|
|
||||||
if (Cypress.env('NX_SUCCESSOR_MARKETS')) {
|
for (const rowNumber in rows) {
|
||||||
validateMarketDataRow(2, 'Parent Market ID', 'PARENT-A');
|
const [name, value] = rows[rowNumber];
|
||||||
|
validateMarketDataRow(Number(rowNumber), name, value);
|
||||||
}
|
}
|
||||||
validateMarketDataRow(
|
|
||||||
3,
|
|
||||||
'Trading Mode',
|
|
||||||
MarketTradingModeMapping.TRADING_MODE_CONTINUOUS
|
|
||||||
);
|
|
||||||
validateMarketDataRow(4, 'Market Decimal Places', '5');
|
|
||||||
validateMarketDataRow(5, 'Position Decimal Places', '0');
|
|
||||||
validateMarketDataRow(6, 'Settlement Asset Decimal Places', '5');
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it('instrument displayed', () => {
|
it('instrument displayed', () => {
|
||||||
|
@ -36,6 +36,7 @@ import {
|
|||||||
successorMarketQuery,
|
successorMarketQuery,
|
||||||
parentMarketIdQuery,
|
parentMarketIdQuery,
|
||||||
successorMarketIdsQuery,
|
successorMarketIdsQuery,
|
||||||
|
successorMarketProposalDetailsQuery,
|
||||||
} from '@vegaprotocol/mock';
|
} from '@vegaprotocol/mock';
|
||||||
import type { PartialDeep } from 'type-fest';
|
import type { PartialDeep } from 'type-fest';
|
||||||
import type { MarketDataQuery, MarketsQuery } from '@vegaprotocol/markets';
|
import type { MarketDataQuery, MarketsQuery } from '@vegaprotocol/markets';
|
||||||
@ -186,6 +187,11 @@ const mockTradingPage = (
|
|||||||
aliasGQLQuery(req, 'SuccessorMarket', successorMarketQuery());
|
aliasGQLQuery(req, 'SuccessorMarket', successorMarketQuery());
|
||||||
aliasGQLQuery(req, 'ParentMarketId', parentMarketIdQuery());
|
aliasGQLQuery(req, 'ParentMarketId', parentMarketIdQuery());
|
||||||
aliasGQLQuery(req, 'SuccessorMarketIds', successorMarketIdsQuery());
|
aliasGQLQuery(req, 'SuccessorMarketIds', successorMarketIdsQuery());
|
||||||
|
aliasGQLQuery(
|
||||||
|
req,
|
||||||
|
'SuccessorMarketProposalDetails',
|
||||||
|
successorMarketProposalDetailsQuery()
|
||||||
|
);
|
||||||
};
|
};
|
||||||
declare global {
|
declare global {
|
||||||
// eslint-disable-next-line @typescript-eslint/no-namespace
|
// eslint-disable-next-line @typescript-eslint/no-namespace
|
||||||
|
@ -49,11 +49,6 @@ jest.mock('@vegaprotocol/markets', () => ({
|
|||||||
: { data: undefined },
|
: { data: undefined },
|
||||||
}));
|
}));
|
||||||
|
|
||||||
jest.mock('@vegaprotocol/environment', () => ({
|
|
||||||
...jest.requireActual('@vegaprotocol/environment'),
|
|
||||||
FLAGS: { SUCCESSOR_MARKETS: true } as Partial<FeatureFlags>,
|
|
||||||
}));
|
|
||||||
|
|
||||||
jest.mock('@vegaprotocol/environment', () => {
|
jest.mock('@vegaprotocol/environment', () => {
|
||||||
const actual = jest.requireActual('@vegaprotocol/environment');
|
const actual = jest.requireActual('@vegaprotocol/environment');
|
||||||
return {
|
return {
|
||||||
@ -61,7 +56,7 @@ jest.mock('@vegaprotocol/environment', () => {
|
|||||||
FLAGS: {
|
FLAGS: {
|
||||||
...actual.FLAGS,
|
...actual.FLAGS,
|
||||||
SUCCESSOR_MARKETS: true,
|
SUCCESSOR_MARKETS: true,
|
||||||
},
|
} as FeatureFlags,
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -30,6 +30,7 @@ import { useOracleProofs } from '../../hooks';
|
|||||||
import { OracleDialog } from '../oracle-dialog/oracle-dialog';
|
import { OracleDialog } from '../oracle-dialog/oracle-dialog';
|
||||||
import { useDataProvider } from '@vegaprotocol/data-provider';
|
import { useDataProvider } from '@vegaprotocol/data-provider';
|
||||||
import { useParentMarketIdQuery } from '../../__generated__';
|
import { useParentMarketIdQuery } from '../../__generated__';
|
||||||
|
import { useSuccessorMarketProposalDetailsQuery } from '@vegaprotocol/proposals';
|
||||||
|
|
||||||
type MarketInfoProps = {
|
type MarketInfoProps = {
|
||||||
market: MarketInfo;
|
market: MarketInfo;
|
||||||
@ -144,6 +145,14 @@ export const KeyDetailsInfoPanel = ({ market }: MarketInfoProps) => {
|
|||||||
},
|
},
|
||||||
skip: !FLAGS.SUCCESSOR_MARKETS,
|
skip: !FLAGS.SUCCESSOR_MARKETS,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const { data: successor } = useSuccessorMarketProposalDetailsQuery({
|
||||||
|
variables: {
|
||||||
|
proposalId: market.proposal?.id || '',
|
||||||
|
},
|
||||||
|
skip: !FLAGS.SUCCESSOR_MARKETS || !market.proposal?.id,
|
||||||
|
});
|
||||||
|
|
||||||
const assetDecimals =
|
const assetDecimals =
|
||||||
market.tradableInstrument.instrument.product.settlementAsset.decimals;
|
market.tradableInstrument.instrument.product.settlementAsset.decimals;
|
||||||
|
|
||||||
@ -155,6 +164,11 @@ export const KeyDetailsInfoPanel = ({ market }: MarketInfoProps) => {
|
|||||||
name: market.tradableInstrument.instrument.name,
|
name: market.tradableInstrument.instrument.name,
|
||||||
marketID: market.id,
|
marketID: market.id,
|
||||||
parentMarketID: parentData?.market?.parentMarketID || '-',
|
parentMarketID: parentData?.market?.parentMarketID || '-',
|
||||||
|
insurancePoolFraction:
|
||||||
|
(successor?.proposal?.terms.change.__typename === 'NewMarket' &&
|
||||||
|
successor.proposal.terms.change.successorConfiguration
|
||||||
|
?.insurancePoolFraction) ||
|
||||||
|
'-',
|
||||||
tradingMode:
|
tradingMode:
|
||||||
market.tradingMode &&
|
market.tradingMode &&
|
||||||
MarketTradingModeMapping[market.tradingMode],
|
MarketTradingModeMapping[market.tradingMode],
|
||||||
|
@ -102,5 +102,8 @@ export const tooltipMapping: Record<string, ReactNode> = {
|
|||||||
`The market's liquidity requirement which is derived from the maximum open interest observed over a rolling time window.`
|
`The market's liquidity requirement which is derived from the maximum open interest observed over a rolling time window.`
|
||||||
),
|
),
|
||||||
suppliedStake: t('The current amount of liquidity supplied for this market.'),
|
suppliedStake: t('The current amount of liquidity supplied for this market.'),
|
||||||
parentMarketID: t('The ID of the market this market succeeds'),
|
parentMarketID: t('The ID of the market this market succeeds.'),
|
||||||
|
insurancePoolFraction: t(
|
||||||
|
'The fraction of the insurance pool balance that is carried over from the parent market to the successor.'
|
||||||
|
),
|
||||||
};
|
};
|
||||||
|
@ -5,6 +5,7 @@ import type {
|
|||||||
import * as Schema from '@vegaprotocol/types';
|
import * as Schema from '@vegaprotocol/types';
|
||||||
import type { PartialDeep } from 'type-fest';
|
import type { PartialDeep } from 'type-fest';
|
||||||
import merge from 'lodash/merge';
|
import merge from 'lodash/merge';
|
||||||
|
import type { SuccessorMarketProposalDetailsQuery } from '../proposals-hooks';
|
||||||
|
|
||||||
export const proposalListQuery = (
|
export const proposalListQuery = (
|
||||||
override?: PartialDeep<ProposalsListQuery>
|
override?: PartialDeep<ProposalsListQuery>
|
||||||
@ -1284,3 +1285,27 @@ const proposalListFields: ProposalListFieldsFragment[] = [
|
|||||||
__typename: 'Proposal',
|
__typename: 'Proposal',
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
|
export const successorMarketProposalDetailsQuery = (
|
||||||
|
override?: SuccessorMarketProposalDetailsQuery
|
||||||
|
): SuccessorMarketProposalDetailsQuery =>
|
||||||
|
merge(
|
||||||
|
{
|
||||||
|
__typename: 'Query',
|
||||||
|
proposal: {
|
||||||
|
__typename: 'Proposal',
|
||||||
|
terms: {
|
||||||
|
__typename: 'ProposalTerms',
|
||||||
|
change: {
|
||||||
|
__typename: 'NewMarket',
|
||||||
|
successorConfiguration: {
|
||||||
|
__typename: 'SuccessorConfiguration',
|
||||||
|
insurancePoolFraction: '0.75',
|
||||||
|
parentMarketId: 'PARENT-A',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
override
|
||||||
|
);
|
||||||
|
@ -40,3 +40,30 @@ query ProposalOfMarket($marketId: ID!) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
query SuccessorMarketProposalDetails($proposalId: ID!) {
|
||||||
|
proposal(id: $proposalId) {
|
||||||
|
id
|
||||||
|
terms {
|
||||||
|
change {
|
||||||
|
... on NewMarket {
|
||||||
|
successorConfiguration {
|
||||||
|
parentMarketId
|
||||||
|
insurancePoolFraction
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
query InstrumentDetails($marketId: ID!) {
|
||||||
|
market(id: $marketId) {
|
||||||
|
tradableInstrument {
|
||||||
|
instrument {
|
||||||
|
code
|
||||||
|
name
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -27,6 +27,20 @@ export type ProposalOfMarketQueryVariables = Types.Exact<{
|
|||||||
|
|
||||||
export type ProposalOfMarketQuery = { __typename?: 'Query', proposal?: { __typename?: 'Proposal', id?: string | null, terms: { __typename?: 'ProposalTerms', enactmentDatetime?: any | null } } | null };
|
export type ProposalOfMarketQuery = { __typename?: 'Query', proposal?: { __typename?: 'Proposal', id?: string | null, terms: { __typename?: 'ProposalTerms', enactmentDatetime?: any | null } } | null };
|
||||||
|
|
||||||
|
export type SuccessorMarketProposalDetailsQueryVariables = Types.Exact<{
|
||||||
|
proposalId: Types.Scalars['ID'];
|
||||||
|
}>;
|
||||||
|
|
||||||
|
|
||||||
|
export type SuccessorMarketProposalDetailsQuery = { __typename?: 'Query', proposal?: { __typename?: 'Proposal', id?: string | null, terms: { __typename?: 'ProposalTerms', change: { __typename?: 'CancelTransfer' } | { __typename?: 'NewAsset' } | { __typename?: 'NewFreeform' } | { __typename?: 'NewMarket', successorConfiguration?: { __typename?: 'SuccessorConfiguration', parentMarketId: string, insurancePoolFraction: string } | null } | { __typename?: 'NewTransfer' } | { __typename?: 'UpdateAsset' } | { __typename?: 'UpdateMarket' } | { __typename?: 'UpdateNetworkParameter' } } } | null };
|
||||||
|
|
||||||
|
export type InstrumentDetailsQueryVariables = Types.Exact<{
|
||||||
|
marketId: Types.Scalars['ID'];
|
||||||
|
}>;
|
||||||
|
|
||||||
|
|
||||||
|
export type InstrumentDetailsQuery = { __typename?: 'Query', market?: { __typename?: 'Market', tradableInstrument: { __typename?: 'TradableInstrument', instrument: { __typename?: 'Instrument', code: string, name: string } } } | null };
|
||||||
|
|
||||||
export const ProposalEventFieldsFragmentDoc = gql`
|
export const ProposalEventFieldsFragmentDoc = gql`
|
||||||
fragment ProposalEventFields on Proposal {
|
fragment ProposalEventFields on Proposal {
|
||||||
id
|
id
|
||||||
@ -148,3 +162,88 @@ export function useProposalOfMarketLazyQuery(baseOptions?: Apollo.LazyQueryHookO
|
|||||||
export type ProposalOfMarketQueryHookResult = ReturnType<typeof useProposalOfMarketQuery>;
|
export type ProposalOfMarketQueryHookResult = ReturnType<typeof useProposalOfMarketQuery>;
|
||||||
export type ProposalOfMarketLazyQueryHookResult = ReturnType<typeof useProposalOfMarketLazyQuery>;
|
export type ProposalOfMarketLazyQueryHookResult = ReturnType<typeof useProposalOfMarketLazyQuery>;
|
||||||
export type ProposalOfMarketQueryResult = Apollo.QueryResult<ProposalOfMarketQuery, ProposalOfMarketQueryVariables>;
|
export type ProposalOfMarketQueryResult = Apollo.QueryResult<ProposalOfMarketQuery, ProposalOfMarketQueryVariables>;
|
||||||
|
export const SuccessorMarketProposalDetailsDocument = gql`
|
||||||
|
query SuccessorMarketProposalDetails($proposalId: ID!) {
|
||||||
|
proposal(id: $proposalId) {
|
||||||
|
id
|
||||||
|
terms {
|
||||||
|
change {
|
||||||
|
... on NewMarket {
|
||||||
|
successorConfiguration {
|
||||||
|
parentMarketId
|
||||||
|
insurancePoolFraction
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* __useSuccessorMarketProposalDetailsQuery__
|
||||||
|
*
|
||||||
|
* To run a query within a React component, call `useSuccessorMarketProposalDetailsQuery` and pass it any options that fit your needs.
|
||||||
|
* When your component renders, `useSuccessorMarketProposalDetailsQuery` returns an object from Apollo Client that contains loading, error, and data properties
|
||||||
|
* you can use to render your UI.
|
||||||
|
*
|
||||||
|
* @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options;
|
||||||
|
*
|
||||||
|
* @example
|
||||||
|
* const { data, loading, error } = useSuccessorMarketProposalDetailsQuery({
|
||||||
|
* variables: {
|
||||||
|
* proposalId: // value for 'proposalId'
|
||||||
|
* },
|
||||||
|
* });
|
||||||
|
*/
|
||||||
|
export function useSuccessorMarketProposalDetailsQuery(baseOptions: Apollo.QueryHookOptions<SuccessorMarketProposalDetailsQuery, SuccessorMarketProposalDetailsQueryVariables>) {
|
||||||
|
const options = {...defaultOptions, ...baseOptions}
|
||||||
|
return Apollo.useQuery<SuccessorMarketProposalDetailsQuery, SuccessorMarketProposalDetailsQueryVariables>(SuccessorMarketProposalDetailsDocument, options);
|
||||||
|
}
|
||||||
|
export function useSuccessorMarketProposalDetailsLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions<SuccessorMarketProposalDetailsQuery, SuccessorMarketProposalDetailsQueryVariables>) {
|
||||||
|
const options = {...defaultOptions, ...baseOptions}
|
||||||
|
return Apollo.useLazyQuery<SuccessorMarketProposalDetailsQuery, SuccessorMarketProposalDetailsQueryVariables>(SuccessorMarketProposalDetailsDocument, options);
|
||||||
|
}
|
||||||
|
export type SuccessorMarketProposalDetailsQueryHookResult = ReturnType<typeof useSuccessorMarketProposalDetailsQuery>;
|
||||||
|
export type SuccessorMarketProposalDetailsLazyQueryHookResult = ReturnType<typeof useSuccessorMarketProposalDetailsLazyQuery>;
|
||||||
|
export type SuccessorMarketProposalDetailsQueryResult = Apollo.QueryResult<SuccessorMarketProposalDetailsQuery, SuccessorMarketProposalDetailsQueryVariables>;
|
||||||
|
export const InstrumentDetailsDocument = gql`
|
||||||
|
query InstrumentDetails($marketId: ID!) {
|
||||||
|
market(id: $marketId) {
|
||||||
|
tradableInstrument {
|
||||||
|
instrument {
|
||||||
|
code
|
||||||
|
name
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* __useInstrumentDetailsQuery__
|
||||||
|
*
|
||||||
|
* To run a query within a React component, call `useInstrumentDetailsQuery` and pass it any options that fit your needs.
|
||||||
|
* When your component renders, `useInstrumentDetailsQuery` returns an object from Apollo Client that contains loading, error, and data properties
|
||||||
|
* you can use to render your UI.
|
||||||
|
*
|
||||||
|
* @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options;
|
||||||
|
*
|
||||||
|
* @example
|
||||||
|
* const { data, loading, error } = useInstrumentDetailsQuery({
|
||||||
|
* variables: {
|
||||||
|
* marketId: // value for 'marketId'
|
||||||
|
* },
|
||||||
|
* });
|
||||||
|
*/
|
||||||
|
export function useInstrumentDetailsQuery(baseOptions: Apollo.QueryHookOptions<InstrumentDetailsQuery, InstrumentDetailsQueryVariables>) {
|
||||||
|
const options = {...defaultOptions, ...baseOptions}
|
||||||
|
return Apollo.useQuery<InstrumentDetailsQuery, InstrumentDetailsQueryVariables>(InstrumentDetailsDocument, options);
|
||||||
|
}
|
||||||
|
export function useInstrumentDetailsLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions<InstrumentDetailsQuery, InstrumentDetailsQueryVariables>) {
|
||||||
|
const options = {...defaultOptions, ...baseOptions}
|
||||||
|
return Apollo.useLazyQuery<InstrumentDetailsQuery, InstrumentDetailsQueryVariables>(InstrumentDetailsDocument, options);
|
||||||
|
}
|
||||||
|
export type InstrumentDetailsQueryHookResult = ReturnType<typeof useInstrumentDetailsQuery>;
|
||||||
|
export type InstrumentDetailsLazyQueryHookResult = ReturnType<typeof useInstrumentDetailsLazyQuery>;
|
||||||
|
export type InstrumentDetailsQueryResult = Apollo.QueryResult<InstrumentDetailsQuery, InstrumentDetailsQueryVariables>;
|
@ -3,3 +3,4 @@ export * from './use-proposal-event';
|
|||||||
export * from './use-proposal-submit';
|
export * from './use-proposal-submit';
|
||||||
export * from './use-update-proposal';
|
export * from './use-update-proposal';
|
||||||
export * from './use-update-network-paramaters-toasts';
|
export * from './use-update-network-paramaters-toasts';
|
||||||
|
export * from './use-successor-market-proposal-details';
|
||||||
|
@ -0,0 +1,39 @@
|
|||||||
|
import omit from 'lodash/omit';
|
||||||
|
import {
|
||||||
|
useInstrumentDetailsQuery,
|
||||||
|
useSuccessorMarketProposalDetailsQuery,
|
||||||
|
} from './__generated__/Proposal';
|
||||||
|
|
||||||
|
export const useSuccessorMarketProposalDetails = (
|
||||||
|
proposalId?: string | null
|
||||||
|
) => {
|
||||||
|
const { data: proposal } = useSuccessorMarketProposalDetailsQuery({
|
||||||
|
variables: {
|
||||||
|
proposalId: proposalId || '',
|
||||||
|
},
|
||||||
|
skip: !proposalId || proposalId.length === 0,
|
||||||
|
});
|
||||||
|
|
||||||
|
const successorDetails =
|
||||||
|
(proposal?.proposal &&
|
||||||
|
proposal.proposal?.terms.change.__typename === 'NewMarket' &&
|
||||||
|
proposal.proposal.terms.change.successorConfiguration) ||
|
||||||
|
undefined;
|
||||||
|
|
||||||
|
const { data: market } = useInstrumentDetailsQuery({
|
||||||
|
variables: {
|
||||||
|
marketId: successorDetails?.parentMarketId || '',
|
||||||
|
},
|
||||||
|
skip:
|
||||||
|
!successorDetails?.parentMarketId ||
|
||||||
|
successorDetails.parentMarketId.length === 0,
|
||||||
|
});
|
||||||
|
|
||||||
|
const details = {
|
||||||
|
...successorDetails,
|
||||||
|
code: market?.market?.tradableInstrument.instrument.code,
|
||||||
|
name: market?.market?.tradableInstrument.instrument.name,
|
||||||
|
};
|
||||||
|
|
||||||
|
return omit(details, '__typename');
|
||||||
|
};
|
Loading…
Reference in New Issue
Block a user