feat: rollback using market.data as a source of current fundingPeriod startTime
This commit is contained in:
parent
5d792d2458
commit
4dd65b4923
@ -15,10 +15,10 @@ import {
|
|||||||
getDataSourceSpecForSettlementSchedule,
|
getDataSourceSpecForSettlementSchedule,
|
||||||
isMarketInAuction,
|
isMarketInAuction,
|
||||||
marketInfoProvider,
|
marketInfoProvider,
|
||||||
|
useFundingPeriodsQuery,
|
||||||
useFundingRate,
|
useFundingRate,
|
||||||
useMarketTradingMode,
|
useMarketTradingMode,
|
||||||
useExternalTwap,
|
useExternalTwap,
|
||||||
useFundingPeriodStartTime,
|
|
||||||
} from '@vegaprotocol/markets';
|
} from '@vegaprotocol/markets';
|
||||||
import { MarketState as State } from '@vegaprotocol/types';
|
import { MarketState as State } from '@vegaprotocol/types';
|
||||||
import { HeaderStat } from '../../components/header';
|
import { HeaderStat } from '../../components/header';
|
||||||
@ -188,12 +188,11 @@ const useNow = () => {
|
|||||||
return now;
|
return now;
|
||||||
};
|
};
|
||||||
|
|
||||||
const useEvery = (marketId: string) => {
|
const useEvery = (marketId: string, skip: boolean) => {
|
||||||
const { data: marketTradingMode } = useMarketTradingMode(marketId);
|
|
||||||
const { data: marketInfo } = useDataProvider({
|
const { data: marketInfo } = useDataProvider({
|
||||||
dataProvider: marketInfoProvider,
|
dataProvider: marketInfoProvider,
|
||||||
variables: { marketId },
|
variables: { marketId },
|
||||||
skip: !marketTradingMode || isMarketInAuction(marketTradingMode),
|
skip,
|
||||||
});
|
});
|
||||||
let every: number | undefined = undefined;
|
let every: number | undefined = undefined;
|
||||||
const sourceType =
|
const sourceType =
|
||||||
@ -211,10 +210,19 @@ const useEvery = (marketId: string) => {
|
|||||||
return every;
|
return every;
|
||||||
};
|
};
|
||||||
|
|
||||||
const useStartTime = (marketId: string) => {
|
const useStartTime = (marketId: string, skip: boolean) => {
|
||||||
const { data: startTime } = useFundingPeriodStartTime(marketId);
|
const { data: fundingPeriods } = useFundingPeriodsQuery({
|
||||||
if (startTime) {
|
pollInterval: 5000,
|
||||||
return fromNanoSeconds(startTime).getTime();
|
skip,
|
||||||
|
variables: {
|
||||||
|
marketId: marketId,
|
||||||
|
pagination: { first: 1 },
|
||||||
|
},
|
||||||
|
});
|
||||||
|
const node = fundingPeriods?.fundingPeriods.edges?.[0]?.node;
|
||||||
|
let startTime: number | undefined = undefined;
|
||||||
|
if (node && node.startTime && !node.endTime) {
|
||||||
|
startTime = fromNanoSeconds(node.startTime).getTime();
|
||||||
}
|
}
|
||||||
return startTime;
|
return startTime;
|
||||||
};
|
};
|
||||||
@ -239,8 +247,10 @@ const useFormatCountdown = (
|
|||||||
|
|
||||||
export const FundingCountdown = ({ marketId }: { marketId: string }) => {
|
export const FundingCountdown = ({ marketId }: { marketId: string }) => {
|
||||||
const now = useNow();
|
const now = useNow();
|
||||||
const startTime = useStartTime(marketId);
|
const { data: marketTradingMode } = useMarketTradingMode(marketId);
|
||||||
const every = useEvery(marketId);
|
const skip = !marketTradingMode || isMarketInAuction(marketTradingMode);
|
||||||
|
const startTime = useStartTime(marketId, skip);
|
||||||
|
const every = useEvery(marketId, skip);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div data-testid="funding-countdown">
|
<div data-testid="funding-countdown">
|
||||||
|
12
libs/markets/src/lib/__generated__/market-data.ts
generated
12
libs/markets/src/lib/__generated__/market-data.ts
generated
@ -3,23 +3,23 @@ import * as Types from '@vegaprotocol/types';
|
|||||||
import { gql } from '@apollo/client';
|
import { gql } from '@apollo/client';
|
||||||
import * as Apollo from '@apollo/client';
|
import * as Apollo from '@apollo/client';
|
||||||
const defaultOptions = {} as const;
|
const defaultOptions = {} as const;
|
||||||
export type MarketDataUpdateFieldsFragment = { __typename?: 'ObservableMarketData', marketId: string, auctionEnd?: string | null, auctionStart?: string | null, bestBidPrice: string, bestBidVolume: string, bestOfferPrice: string, bestOfferVolume: string, bestStaticBidPrice: string, bestStaticBidVolume: string, bestStaticOfferPrice: string, bestStaticOfferVolume: string, indicativePrice: string, indicativeVolume: string, marketState: Types.MarketState, marketTradingMode: Types.MarketTradingMode, markPrice: string, midPrice: string, openInterest: string, staticMidPrice: string, suppliedStake?: string | null, targetStake?: string | null, trigger: Types.AuctionTrigger, lastTradedPrice: string, productData?: { __typename?: 'PerpetualData', fundingRate?: string | null, fundingPayment?: string | null, externalTwap?: string | null, internalTwap?: string | null, seqNum: number, startTime: any } | null, priceMonitoringBounds?: Array<{ __typename?: 'PriceMonitoringBounds', minValidPrice: string, maxValidPrice: string, referencePrice: string, trigger: { __typename?: 'PriceMonitoringTrigger', horizonSecs: number, probability: number, auctionExtensionSecs: number } }> | null };
|
export type MarketDataUpdateFieldsFragment = { __typename?: 'ObservableMarketData', marketId: string, auctionEnd?: string | null, auctionStart?: string | null, bestBidPrice: string, bestBidVolume: string, bestOfferPrice: string, bestOfferVolume: string, bestStaticBidPrice: string, bestStaticBidVolume: string, bestStaticOfferPrice: string, bestStaticOfferVolume: string, indicativePrice: string, indicativeVolume: string, marketState: Types.MarketState, marketTradingMode: Types.MarketTradingMode, markPrice: string, midPrice: string, openInterest: string, staticMidPrice: string, suppliedStake?: string | null, targetStake?: string | null, trigger: Types.AuctionTrigger, lastTradedPrice: string, productData?: { __typename?: 'PerpetualData', fundingRate?: string | null, fundingPayment?: string | null, externalTwap?: string | null, internalTwap?: string | null } | null, priceMonitoringBounds?: Array<{ __typename?: 'PriceMonitoringBounds', minValidPrice: string, maxValidPrice: string, referencePrice: string, trigger: { __typename?: 'PriceMonitoringTrigger', horizonSecs: number, probability: number, auctionExtensionSecs: number } }> | null };
|
||||||
|
|
||||||
export type MarketDataUpdateSubscriptionVariables = Types.Exact<{
|
export type MarketDataUpdateSubscriptionVariables = Types.Exact<{
|
||||||
marketId: Types.Scalars['ID'];
|
marketId: Types.Scalars['ID'];
|
||||||
}>;
|
}>;
|
||||||
|
|
||||||
|
|
||||||
export type MarketDataUpdateSubscription = { __typename?: 'Subscription', marketsData: Array<{ __typename?: 'ObservableMarketData', marketId: string, auctionEnd?: string | null, auctionStart?: string | null, bestBidPrice: string, bestBidVolume: string, bestOfferPrice: string, bestOfferVolume: string, bestStaticBidPrice: string, bestStaticBidVolume: string, bestStaticOfferPrice: string, bestStaticOfferVolume: string, indicativePrice: string, indicativeVolume: string, marketState: Types.MarketState, marketTradingMode: Types.MarketTradingMode, markPrice: string, midPrice: string, openInterest: string, staticMidPrice: string, suppliedStake?: string | null, targetStake?: string | null, trigger: Types.AuctionTrigger, lastTradedPrice: string, productData?: { __typename?: 'PerpetualData', fundingRate?: string | null, fundingPayment?: string | null, externalTwap?: string | null, internalTwap?: string | null, seqNum: number, startTime: any } | null, priceMonitoringBounds?: Array<{ __typename?: 'PriceMonitoringBounds', minValidPrice: string, maxValidPrice: string, referencePrice: string, trigger: { __typename?: 'PriceMonitoringTrigger', horizonSecs: number, probability: number, auctionExtensionSecs: number } }> | null }> };
|
export type MarketDataUpdateSubscription = { __typename?: 'Subscription', marketsData: Array<{ __typename?: 'ObservableMarketData', marketId: string, auctionEnd?: string | null, auctionStart?: string | null, bestBidPrice: string, bestBidVolume: string, bestOfferPrice: string, bestOfferVolume: string, bestStaticBidPrice: string, bestStaticBidVolume: string, bestStaticOfferPrice: string, bestStaticOfferVolume: string, indicativePrice: string, indicativeVolume: string, marketState: Types.MarketState, marketTradingMode: Types.MarketTradingMode, markPrice: string, midPrice: string, openInterest: string, staticMidPrice: string, suppliedStake?: string | null, targetStake?: string | null, trigger: Types.AuctionTrigger, lastTradedPrice: string, productData?: { __typename?: 'PerpetualData', fundingRate?: string | null, fundingPayment?: string | null, externalTwap?: string | null, internalTwap?: string | null } | null, priceMonitoringBounds?: Array<{ __typename?: 'PriceMonitoringBounds', minValidPrice: string, maxValidPrice: string, referencePrice: string, trigger: { __typename?: 'PriceMonitoringTrigger', horizonSecs: number, probability: number, auctionExtensionSecs: number } }> | null }> };
|
||||||
|
|
||||||
export type MarketDataFieldsFragment = { __typename?: 'MarketData', auctionEnd?: string | null, auctionStart?: string | null, bestBidPrice: string, bestBidVolume: string, bestOfferPrice: string, bestOfferVolume: string, bestStaticBidPrice: string, bestStaticBidVolume: string, bestStaticOfferPrice: string, bestStaticOfferVolume: string, indicativePrice: string, indicativeVolume: string, marketState: Types.MarketState, marketTradingMode: Types.MarketTradingMode, markPrice: string, midPrice: string, openInterest: string, staticMidPrice: string, suppliedStake?: string | null, targetStake?: string | null, trigger: Types.AuctionTrigger, lastTradedPrice: string, market: { __typename?: 'Market', id: string }, productData?: { __typename?: 'PerpetualData', fundingRate?: string | null, fundingPayment?: string | null, externalTwap?: string | null, internalTwap?: string | null, seqNum: number, startTime: any } | null, priceMonitoringBounds?: Array<{ __typename?: 'PriceMonitoringBounds', minValidPrice: string, maxValidPrice: string, referencePrice: string, trigger: { __typename?: 'PriceMonitoringTrigger', horizonSecs: number, probability: number, auctionExtensionSecs: number } }> | null };
|
export type MarketDataFieldsFragment = { __typename?: 'MarketData', auctionEnd?: string | null, auctionStart?: string | null, bestBidPrice: string, bestBidVolume: string, bestOfferPrice: string, bestOfferVolume: string, bestStaticBidPrice: string, bestStaticBidVolume: string, bestStaticOfferPrice: string, bestStaticOfferVolume: string, indicativePrice: string, indicativeVolume: string, marketState: Types.MarketState, marketTradingMode: Types.MarketTradingMode, markPrice: string, midPrice: string, openInterest: string, staticMidPrice: string, suppliedStake?: string | null, targetStake?: string | null, trigger: Types.AuctionTrigger, lastTradedPrice: string, market: { __typename?: 'Market', id: string }, productData?: { __typename?: 'PerpetualData', fundingRate?: string | null, fundingPayment?: string | null, externalTwap?: string | null, internalTwap?: string | null } | null, priceMonitoringBounds?: Array<{ __typename?: 'PriceMonitoringBounds', minValidPrice: string, maxValidPrice: string, referencePrice: string, trigger: { __typename?: 'PriceMonitoringTrigger', horizonSecs: number, probability: number, auctionExtensionSecs: number } }> | null };
|
||||||
|
|
||||||
export type MarketDataQueryVariables = Types.Exact<{
|
export type MarketDataQueryVariables = Types.Exact<{
|
||||||
marketId: Types.Scalars['ID'];
|
marketId: Types.Scalars['ID'];
|
||||||
}>;
|
}>;
|
||||||
|
|
||||||
|
|
||||||
export type MarketDataQuery = { __typename?: 'Query', marketsConnection?: { __typename?: 'MarketConnection', edges: Array<{ __typename?: 'MarketEdge', node: { __typename?: 'Market', data?: { __typename?: 'MarketData', auctionEnd?: string | null, auctionStart?: string | null, bestBidPrice: string, bestBidVolume: string, bestOfferPrice: string, bestOfferVolume: string, bestStaticBidPrice: string, bestStaticBidVolume: string, bestStaticOfferPrice: string, bestStaticOfferVolume: string, indicativePrice: string, indicativeVolume: string, marketState: Types.MarketState, marketTradingMode: Types.MarketTradingMode, markPrice: string, midPrice: string, openInterest: string, staticMidPrice: string, suppliedStake?: string | null, targetStake?: string | null, trigger: Types.AuctionTrigger, lastTradedPrice: string, market: { __typename?: 'Market', id: string }, productData?: { __typename?: 'PerpetualData', fundingRate?: string | null, fundingPayment?: string | null, externalTwap?: string | null, internalTwap?: string | null, seqNum: number, startTime: any } | null, priceMonitoringBounds?: Array<{ __typename?: 'PriceMonitoringBounds', minValidPrice: string, maxValidPrice: string, referencePrice: string, trigger: { __typename?: 'PriceMonitoringTrigger', horizonSecs: number, probability: number, auctionExtensionSecs: number } }> | null } | null } }> } | null };
|
export type MarketDataQuery = { __typename?: 'Query', marketsConnection?: { __typename?: 'MarketConnection', edges: Array<{ __typename?: 'MarketEdge', node: { __typename?: 'Market', data?: { __typename?: 'MarketData', auctionEnd?: string | null, auctionStart?: string | null, bestBidPrice: string, bestBidVolume: string, bestOfferPrice: string, bestOfferVolume: string, bestStaticBidPrice: string, bestStaticBidVolume: string, bestStaticOfferPrice: string, bestStaticOfferVolume: string, indicativePrice: string, indicativeVolume: string, marketState: Types.MarketState, marketTradingMode: Types.MarketTradingMode, markPrice: string, midPrice: string, openInterest: string, staticMidPrice: string, suppliedStake?: string | null, targetStake?: string | null, trigger: Types.AuctionTrigger, lastTradedPrice: string, market: { __typename?: 'Market', id: string }, productData?: { __typename?: 'PerpetualData', fundingRate?: string | null, fundingPayment?: string | null, externalTwap?: string | null, internalTwap?: string | null } | null, priceMonitoringBounds?: Array<{ __typename?: 'PriceMonitoringBounds', minValidPrice: string, maxValidPrice: string, referencePrice: string, trigger: { __typename?: 'PriceMonitoringTrigger', horizonSecs: number, probability: number, auctionExtensionSecs: number } }> | null } | null } }> } | null };
|
||||||
|
|
||||||
export const MarketDataUpdateFieldsFragmentDoc = gql`
|
export const MarketDataUpdateFieldsFragmentDoc = gql`
|
||||||
fragment MarketDataUpdateFields on ObservableMarketData {
|
fragment MarketDataUpdateFields on ObservableMarketData {
|
||||||
@ -40,8 +40,6 @@ export const MarketDataUpdateFieldsFragmentDoc = gql`
|
|||||||
fundingPayment
|
fundingPayment
|
||||||
externalTwap
|
externalTwap
|
||||||
internalTwap
|
internalTwap
|
||||||
seqNum
|
|
||||||
startTime
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
indicativePrice
|
indicativePrice
|
||||||
@ -89,8 +87,6 @@ export const MarketDataFieldsFragmentDoc = gql`
|
|||||||
fundingPayment
|
fundingPayment
|
||||||
externalTwap
|
externalTwap
|
||||||
internalTwap
|
internalTwap
|
||||||
seqNum
|
|
||||||
startTime
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
indicativePrice
|
indicativePrice
|
||||||
|
@ -124,16 +124,6 @@ export const marketTradingModeProvider = makeDerivedDataProvider<
|
|||||||
(parts[0] as ReturnType<typeof getData>)?.marketTradingMode
|
(parts[0] as ReturnType<typeof getData>)?.marketTradingMode
|
||||||
);
|
);
|
||||||
|
|
||||||
export const fundingRateStartTimeProvider = makeDerivedDataProvider<
|
|
||||||
NonNullable<MarketDataFieldsFragment['productData']>['startTime'] | undefined,
|
|
||||||
never,
|
|
||||||
MarketDataQueryVariables
|
|
||||||
>(
|
|
||||||
[marketDataProvider],
|
|
||||||
(parts, variables, prevData) =>
|
|
||||||
(parts[0] as ReturnType<typeof getData>)?.productData?.startTime
|
|
||||||
);
|
|
||||||
|
|
||||||
export const marketStateProvider = makeDerivedDataProvider<
|
export const marketStateProvider = makeDerivedDataProvider<
|
||||||
MarketDataFieldsFragment['marketState'] | undefined,
|
MarketDataFieldsFragment['marketState'] | undefined,
|
||||||
never,
|
never,
|
||||||
@ -199,17 +189,6 @@ export const useMarketTradingMode = (marketId?: string, skip?: boolean) => {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
export const useFundingPeriodStartTime = (
|
|
||||||
marketId?: string,
|
|
||||||
skip?: boolean
|
|
||||||
) => {
|
|
||||||
return useDataProvider({
|
|
||||||
dataProvider: fundingRateStartTimeProvider,
|
|
||||||
variables: { marketId: marketId || '' },
|
|
||||||
skip: skip || !marketId,
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
export const useMarketState = (marketId?: string, skip?: boolean) => {
|
export const useMarketState = (marketId?: string, skip?: boolean) => {
|
||||||
return useDataProvider({
|
return useDataProvider({
|
||||||
dataProvider: marketStateProvider,
|
dataProvider: marketStateProvider,
|
||||||
|
@ -16,8 +16,6 @@ fragment MarketDataUpdateFields on ObservableMarketData {
|
|||||||
fundingPayment
|
fundingPayment
|
||||||
externalTwap
|
externalTwap
|
||||||
internalTwap
|
internalTwap
|
||||||
seqNum
|
|
||||||
startTime
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
indicativePrice
|
indicativePrice
|
||||||
@ -70,8 +68,6 @@ fragment MarketDataFields on MarketData {
|
|||||||
fundingPayment
|
fundingPayment
|
||||||
externalTwap
|
externalTwap
|
||||||
internalTwap
|
internalTwap
|
||||||
seqNum
|
|
||||||
startTime
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
indicativePrice
|
indicativePrice
|
||||||
|
4
libs/types/src/__generated__/types.ts
generated
4
libs/types/src/__generated__/types.ts
generated
@ -3683,10 +3683,6 @@ export type PerpetualData = {
|
|||||||
fundingRate?: Maybe<Scalars['String']>;
|
fundingRate?: Maybe<Scalars['String']>;
|
||||||
/** Time-weighted average price calculated from data points for this period from the internal data source. */
|
/** Time-weighted average price calculated from data points for this period from the internal data source. */
|
||||||
internalTwap?: Maybe<Scalars['String']>;
|
internalTwap?: Maybe<Scalars['String']>;
|
||||||
/** Funding period sequence number */
|
|
||||||
seqNum: Scalars['Int'];
|
|
||||||
/** Time at which the funding period started */
|
|
||||||
startTime: Scalars['Timestamp'];
|
|
||||||
};
|
};
|
||||||
|
|
||||||
export type PerpetualProduct = {
|
export type PerpetualProduct = {
|
||||||
|
Loading…
Reference in New Issue
Block a user