From 2cd788486737ef46bc062c1f76141a668946d7b1 Mon Sep 17 00:00:00 2001 From: Matthew Russell Date: Mon, 13 Nov 2023 16:58:13 -0800 Subject: [PATCH] feat: wire up vesting information --- .../rewards-container/Rewards.graphql | 5 ++ .../__generated__/Rewards.ts | 7 ++- .../rewards-container/rewards-container.tsx | 53 ++++++++++++++++--- .../src/lib/__generated__/markets-candles.ts | 14 ++++- 4 files changed, 70 insertions(+), 9 deletions(-) diff --git a/apps/trading/components/rewards-container/Rewards.graphql b/apps/trading/components/rewards-container/Rewards.graphql index c44a9f8c3..a1650ca2e 100644 --- a/apps/trading/components/rewards-container/Rewards.graphql +++ b/apps/trading/components/rewards-container/Rewards.graphql @@ -1,6 +1,11 @@ query RewardsPage($partyId: ID!) { party(id: $partyId) { id + vestingStats { + epochSeq + rewardBonusMultiplier + quantumBalance + } vestingBalancesSummary { epoch vestingBalances { diff --git a/apps/trading/components/rewards-container/__generated__/Rewards.ts b/apps/trading/components/rewards-container/__generated__/Rewards.ts index 71d6d23c1..6d86accc8 100644 --- a/apps/trading/components/rewards-container/__generated__/Rewards.ts +++ b/apps/trading/components/rewards-container/__generated__/Rewards.ts @@ -8,7 +8,7 @@ export type RewardsPageQueryVariables = Types.Exact<{ }>; -export type RewardsPageQuery = { __typename?: 'Query', party?: { __typename?: 'Party', id: string, vestingBalancesSummary: { __typename?: 'PartyVestingBalancesSummary', epoch?: number | null, vestingBalances?: Array<{ __typename?: 'PartyVestingBalance', balance: string, asset: { __typename?: 'Asset', id: string, symbol: string, decimals: number, quantum: string } }> | null, lockedBalances?: Array<{ __typename?: 'PartyLockedBalance', balance: string, untilEpoch: number, asset: { __typename?: 'Asset', id: string, symbol: string, decimals: number, quantum: string } }> | null } } | null }; +export type RewardsPageQuery = { __typename?: 'Query', party?: { __typename?: 'Party', id: string, vestingStats?: { __typename?: 'PartyVestingStats', epochSeq: number, rewardBonusMultiplier: string, quantumBalance: string } | null, vestingBalancesSummary: { __typename?: 'PartyVestingBalancesSummary', epoch?: number | null, vestingBalances?: Array<{ __typename?: 'PartyVestingBalance', balance: string, asset: { __typename?: 'Asset', id: string, symbol: string, decimals: number, quantum: string } }> | null, lockedBalances?: Array<{ __typename?: 'PartyLockedBalance', balance: string, untilEpoch: number, asset: { __typename?: 'Asset', id: string, symbol: string, decimals: number, quantum: string } }> | null } } | null }; export type RewardsHistoryQueryVariables = Types.Exact<{ partyId: Types.Scalars['ID']; @@ -31,6 +31,11 @@ export const RewardsPageDocument = gql` query RewardsPage($partyId: ID!) { party(id: $partyId) { id + vestingStats { + epochSeq + rewardBonusMultiplier + quantumBalance + } vestingBalancesSummary { epoch vestingBalances { diff --git a/apps/trading/components/rewards-container/rewards-container.tsx b/apps/trading/components/rewards-container/rewards-container.tsx index cc76c6338..6257a05f3 100644 --- a/apps/trading/components/rewards-container/rewards-container.tsx +++ b/apps/trading/components/rewards-container/rewards-container.tsx @@ -31,6 +31,7 @@ import { addDecimalsFormatNumberQuantum } from '@vegaprotocol/utils'; import { ViewType, useSidebar } from '../sidebar'; import { useGetCurrentRouteId } from '../../lib/hooks/use-get-current-route-id'; import { RewardsHistoryContainer } from './rewards-history'; +import { useAssetDataProvider } from '@vegaprotocol/assets'; export const RewardsContainer = () => { const { pubKey } = useVegaWallet(); @@ -109,7 +110,14 @@ export const RewardsContainer = () => { ); })} - + -

{t('Not connected')}

+

{t('Not connected')}

); } @@ -276,20 +284,47 @@ export const RewardPot = ({ ) : ( -

{t('No rewards')}

+

{t('No rewards')}

)} ); }; export const Vesting = ({ + assetId, pubKey, baseRate, + multiplier, + vestingBalancesSummary, + epoch, }: { + assetId: string; pubKey: string | null; baseRate: string; + multiplier: string | undefined; + vestingBalancesSummary: VestingBalances | undefined; + epoch: number; }) => { + const { data: asset } = useAssetDataProvider(assetId); + + if (!asset) return null; + const baseRateFormatted = formatPercentage(Number(baseRate)); + + const lockedEntries = vestingBalancesSummary?.lockedBalances?.filter( + (b) => b.asset.id === assetId + ); + + const unlockingNextEpoch = lockedEntries?.filter( + (e) => e.untilEpoch === epoch + 1 + ); + + const nextEpochBalances = unlockingNextEpoch?.length + ? unlockingNextEpoch.map((e) => e.balance) + : [0]; + + const totalUnlockingNextEpoch = BigNumber.sum.apply(null, nextEpochBalances); + return (
@@ -302,11 +337,17 @@ export const Vesting = ({ <> {t('Vesting multiplier')} - 0% + {multiplier} {t('Available to withdraw next epoch')} - 0 + + {addDecimalsFormatNumberQuantum( + totalUnlockingNextEpoch.toString(), + asset.decimals, + asset.quantum + )} + )} @@ -318,7 +359,7 @@ export const Vesting = ({ const Multipliers = () => { return (
-

{t('No active reward bonuses')}

+

{t('No active reward bonuses')}

); }; diff --git a/libs/markets/src/lib/__generated__/markets-candles.ts b/libs/markets/src/lib/__generated__/markets-candles.ts index 1f4d773d5..96292eae8 100644 --- a/libs/markets/src/lib/__generated__/markets-candles.ts +++ b/libs/markets/src/lib/__generated__/markets-candles.ts @@ -1,9 +1,10 @@ import * as Types from '@vegaprotocol/types'; import { gql } from '@apollo/client'; -import { MarketCandlesFieldsFragmentDoc } from './market-candles'; import * as Apollo from '@apollo/client'; const defaultOptions = {} as const; +export type MarketCandlesFieldsFragment = { __typename?: 'Candle', high: string, low: string, open: string, close: string, volume: string, periodStart: any }; + export type MarketsCandlesQueryVariables = Types.Exact<{ interval: Types.Interval; since: Types.Scalars['String']; @@ -12,7 +13,16 @@ export type MarketsCandlesQueryVariables = Types.Exact<{ export type MarketsCandlesQuery = { __typename?: 'Query', marketsConnection?: { __typename?: 'MarketConnection', edges: Array<{ __typename?: 'MarketEdge', node: { __typename?: 'Market', id: string, candlesConnection?: { __typename?: 'CandleDataConnection', edges?: Array<{ __typename?: 'CandleEdge', node: { __typename?: 'Candle', high: string, low: string, open: string, close: string, volume: string, periodStart: any } } | null> | null } | null } }> } | null }; - +export const MarketCandlesFieldsFragmentDoc = gql` + fragment MarketCandlesFields on Candle { + high + low + open + close + volume + periodStart +} + `; export const MarketsCandlesDocument = gql` query MarketsCandles($interval: Interval!, $since: String!) { marketsConnection {